Armazenando dados com fluxos graváveis Node. js Este tutorial explica como armazenar dados com fluxos graváveis Node. js e como criar seu próprio fluxo gravável personalizado. Informações sobre a versão Autor: Jeff Barczewski Publicado em: 18 de agosto de 2013 Tags: nodejs, streams Nível: Intermediário Pré-requisitos: buffers, events, install npm modules Node. js v0.10 (último estável é v0.10.16 até à data desta redação) Geralmente têm sido parte do Node. js desde seus primeiros dias Streams2 A classe writeable abstract pode ser usada com versões mais antigas (antes da v0.10) do nó usando o módulo npm readable-stream (testado com v1.0.15) Armazenando dados com gravável Córregos Escrever arquivo de texto O exemplo mais simples é apenas por escrito texto utf8, uma vez que a codificação padrão se você escrever seqüências de caracteres é utf8. Se você quiser escrever seqüências de caracteres com uma codificação diferente, então você pode simplesmente alterar a linha createWriteStream ou adicionar codificação para cada gravação. Escrevendo arquivo binário Escrever um arquivo binário é apenas uma questão de usar Buffers em vez de seqüências de caracteres para a gravação. No exemplo acima, eu uso crypto. createRandomBytes () para criar um Buffer de dados, mas você pode usar dados binários que você cria ou lê de outra fonte tão facilmente. Saber quando arquivo foi escrito Entrada e saída são operações assíncronas em Node. js Então, o que se queremos saber quando um arquivo foi totalmente escrito A resposta é a configuração de ouvintes para eventos que o fluxo emite. O evento finish (adicionado em Node. js v0.10) indica que todos os dados foram liberados para o sistema subjacente. Em Node. js antes de v0.10, você poderia adicionar um cb para o. end () para obter uma indicação de quando que tinha sido liberado, no entanto terminar leva em conta quaisquer outras transformações a jusante e tal. Criando fluxos graváveis Node. js personalizados Quando você precisa criar seu próprio fluxo gravável personalizado para armazenar dados em um banco de dados ou em outra facilidade de armazenamento, é fácil se você usar a nova classe abstrata de Streams2 Writable disponível nativamente em Node. js 0.10 ou via Npm polyfill módulo readable-stream. Para criar um fluxo gravável que implementa todo o comportamento de fluxo Node. js normal, você só precisa subclasse e escrever write (chunk, encoding, cb). Criando fluxo de memória gravável Aqui está um exemplo que está escrevendo em um armazenamento de dados simples na memória. Estamos usando o nome dado na criação do fluxo como a chave, e acrescentamos dados ao valor até terminar. Os fluxos graváveis são elegantes e simples de usar. Escrever texto ou dados binários para fluxos Node. js é fácil, e até mesmo criar fluxos graváveis personalizados totalmente funcionais é um passeio no parque com a nova funcionalidade streams2 introduzida no Node. js v0.10 (ou Utilizando o módulo polifilho readable-stream). Para leitura adicional Compartilhar esta páginaLeitura de texto e dados binários com fluxos legíveis Node. js Este tutorial irá explicar o uso ea criação de fluxos read. js readable: Informações sobre a versão Autor: Jeff Barczewski Publicado em: 3 de agosto de 2013 Tags: nodejs, streams Nível: Intermediário Pré-requisitos: cripto, eventos, instalar npm módulos Node. js v0.10 (último estável é v0.10.15 até à data desta escrita), mas os córregos foram geralmente uma parte de Node. js desde seus primeiros dias Streams2 pode ser usado com mais velhos Versões do nó usando o módulo npm readable-stream Consumindo ou usando fluxos legíveis Exemplo simples de leitura de um arquivo e ecoando para stdout: Criando um sha1 digest de um arquivo e ecoando o resultado para stdout (similar a shasum): O evento de dados é Disparado sobre o fluxo legível para cada pedaço de dados, então você atualizar o digest com para cada pedaço como você vai, então finalmente o evento final é disparado quando o fluxo terminou para que você possa produzir o resultado final. Note que cada vez que você chama. on () para registrar um ouvinte ele retorna o fluxo original para que você possa encadear métodos facilmente. Com Node. js 0.10 há uma maneira melhor de consumir fluxos. A interface Readable facilita o trabalho com fluxos, especialmente os streams onde você deseja fazer outras coisas entre criar um fluxo e usar o fluxo. Esses fluxos Readable mais recentes são pull streams onde você solicita os dados quando você é lido para ele, em vez de ter os dados empurrados para você. A chave para entender este exemplo é que com a nova interface de leitura de streams2, um evento legível será emitido assim que os dados estiverem disponíveis para serem lidos e você pode chamar. read () para ler pedaços dele. Uma vez que não há mais dados disponíveis. Read () retorna null, mas então outro evento legível é acionado novamente quando os dados estiverem disponíveis novamente. Isso continua até o final do arquivo quando final é acionado como antes. Produzindo um fluxo legível Para usar fluxos com o sistema de arquivos ou do http, você pode usar os métodos core fs e http para construir um fluxo, mas como você criaria seu próprio fluxo e o preencheria com dados. Isso pode ser dados de um banco de dados ou De qualquer número de fontes. Aqui está um exemplo de criação de um fluxo legível que é gerado a partir de dados binários aleatórios, em seguida, hash como antes. Isso seria útil na criação de fluxos para testes: Nota: depois de ler () é chamado, devemos continuar lendo até terminar ou até push () retornar false. Usando Streams2 com versões mais antigas do Node. js Se você quiser fazer este código funcionar com o Node. js mais antigo que 0.10, você pode incluir uma dependência para readable-stream em seu pacote. json e alterar a linha 5 para ler: Fluxo legível se Node. js versão é 0.10 e se não, então ele irá carregar o módulo polyfill readable-stream e usá-lo a partir daí. Pausar o currículo do fluxo e do Streams2 Como os fluxos podem fornecer dados mais rapidamente do que um aplicativo pode consumi-lo, os fluxos incluem a capacidade de pausar e os dados são armazenados em buffer até que o fluxo seja reiniciado. Antes dos streams2, você precisaria prestar muita atenção para pausar e retomar métodos, bem como buffering os dados até retomada. No entanto, Readable de streams2 (Node. js 0.10 ou através do pacote readable-stream) implementa que a funcionalidade para você e os streams são pausados automaticamente até que. read () seja chamado. Você também pode envolver fluxos antigos com uma legível para implementar a nova interface no fluxo antigo: Outra situação onde você precisa se preocupar com pausa e currículo é se o seu consumo de código usa a interface de estilo antigo push chamar. on (39data39, ouvinte). Isso coloca o fluxo no modo de compatibilidade com versões anteriores e você precisaria chamar. pause () e. resume () para controlar a taxa de dados que chegam à sua aplicação. Consulte os documentos da API do Stream para obter detalhes se você estiver usando a interface mais antiga em seu código. Fluxos de objetos Inicialmente, quando os fluxos foram introduzidos, a API oficial indicava que os pedaços de dados sendo transmitidos seriam Buffers ou strings, porém muitos usuários descobriram que era ótimo poder transmitir objetos também. Streams2 no Node. js 0.10 adicionou um modo de objeto a fluxos para formalizar como isso deve funcionar. Quando no modo de objeto. Read (n) simplesmente retorna o próximo objeto (ignorando o n). Para alternar um fluxo em modo de objeto, defina a propriedade objectMode como true nas opções usadas para criar seu fluxo Readable. Assim, você pode usar objetos em fluxos tão facilmente quanto você pode usar Buffers e strings, mas a única limitação é que os objetos que você Pass não pode ser nulo, uma vez que irá indicar que o fluxo foi encerrado. Node. js fluxos legíveis são flexíveis e simples Node. js legível fluxos são fáceis de consumir e até mesmo simples de construir. Você não pode apenas transmitir dados binários e de seqüência de caracteres, mas também objetos e ainda aproveitar a funcionalidade de fluxo. Espero que você tenha gostado dessa visita rápida de córregos legíveis, deixe-me saber se você tiver alguma dúvida. Para leitura adicional Compartilhar esta página jondot CTO em Como. Hacker. Fullstacker. Dados grandes. Open sourcer. Analisando dados binários com Node. js Comece por destacar alguns dos pilares de dados binários, espero que em uma brisa. Se você se sentir muito atraído por esses tópicos, eu recomendo este livro (você pode ignorar as peças HLAassembly). Observe também que o seu oldschool um pouco (eu li que há mais de 10 anos, mas deixou uma boa impressão) para que haja recursos mais novos e melhores para aprender. Uma palavra de computador, é uma espécie de unidade de agrupamento de bits. Por exemplo, uma palavra pode ser 8, 16, 32, 64 etc, bits de largura. Tipicamente, uma largura de palavras é acoplada à largura das arquiteturas de CPUs (isto é, CPU de 64 bits), mas no nosso caso, trata bem o significado de palavra como um conjunto de N bits de tamanho fixo onde N é o número de bits. Endianness O termo endian vem do fim. Quando você olha para uma seqüência de bytes e deseja converter um grupo de bytes para um número antigo simples, ele está para indicar qual final do número é primeiro no caso de big endian a primeira parte é a maior. No caso do pequeno endian a primeira parte é o pequeno. Por exemplo, há duas maneiras de olhar para o par de bytes aparecendo em um arquivo binário: 01 23. Big endian 01 23 0123 291 (sem sinal) little endian 01 23 2301 8961 (sem assinatura) Obviamente, há uma grande diferença. Então, qual ordem é um determinado programa ou arquivo que você está atualmente inspecionando o uso que é algo que você deve obter a partir da documentação, e normalmente não haverá nada (excluindo algumas exceções que estão fora deste escopo) no arquivo para dizer-lhe qual caminho é. Wikipedia sobre Endianness é uma ótima referência para isso se você quiser saber mais. Números (assinados, não assinados) Para completar a imagem, quando um número é serializado em forma binária (arquivo, pacote, etc) seria representado por N palavras, e essas N palavras são armazenadas como NM bytes. Portanto, se um número mapear para uma palavra, e uma palavra seria 2 bytes em nosso layout de arquivo, então precisamos avaliar os 2 bytes no contexto de endianness. Finalmente, também precisamos decidir se o número é assinado ou não assinado. Doente amavelmente deixá-lo como uma pesquisa pessoal para você, para ver as várias formas estão lá para representar números assinados em dados binários, e quais são os mais comuns. Padrões em dados binários Obviamente, arquivos ou pacotes que passam pela rede podem representar qualquer coisa quando são vistos com nossos óculos binários. Quando você examinar alguns dos protocolos e arquivos lá fora, você encontrará alguns padrões mais comuns e terminologia: Cabeçalho - É comum layout de algumas centenas de bytes de um arquivo binário para que você tenha um mapa do que a sua exploração em seu conteúdo . Normalmente isso é chamado de cabeçalho. Segmentos - normalmente uma divisão de um arquivo em vários segmentos para indicar categorização ou hierarquia, um segmento pode ser alinhado com um número conveniente de bytes (por exemplo, 1kb) e, em seguida, o mesmo tipo de segmento pode repetir. Padding - quando um bloco de bytes consecutivos termina com um número ímpar - por exemplo: 7, é mais conveniente tanto no serializador como no ponto de vista dos desserializadores dar um pequeno cutucão e torná-lo um bloco de 8 bytes (os últimos bytes tipicamente Obter um valor 0). Isto vai mostrar o quão importante é o alinhamento de palavras (uma palavra é tipicamente 16, 32, 64 bits, que é um número par de bytes). Uma palavra sobre Node. js Primeiro Id gostaria de sair do caminho o fato de que eu não sou casado com Node. js. Em outras palavras, eu não vou para rediculous comprimentos para fazê-lo funcionar para mim, ou para fazer você gosta. Neste caso particular eu tive alguns requisitos e Node. js cumpriu aqueles mais do que felizmente para mim em termos de desempenho e comportamento assíncrono, e me deixou feliz. Análise binária prática com Node Ou faça-o à mão e arrisque a sua sanidade dada uma linguagem bastante complexa (no nosso caso uma linguagem é um formato binário ou protocolo) ou, aqui estão algumas coisas que você pode usar e sua contrapartida Node-ish: tradicional (Parabrisas PEG) - Canopy Parser de dados binários (para a falta de um nome melhor) - node-binary. Dissolve Nifty bit-strings (Erlang) - bitsyntax-js Nesse caso, Ill ser usando Parâmetro binário de dados do substacks node-binário. No momento da escrita que eu não estava ciente de Dissolve - que parece muito semelhante em termos de API, mas é mais novo e mais simples na implementação como afirma espero que eu começar a avaliá-lo e dar uma boa comparação em breve. Infelizmente o formato que eu estava analisando é proprietário, então eu não posso apenas colar o formato ea solução aqui e ser feito :(. Permite ao invés fazer nosso próprio formato binário, mas usar padrões comuns, que Im certeza youll bump into (check out a PE Cabeçalho para um exemplo mais elaborado) Heres nosso formato de arquivo imaginário (tamanho dos campos entre colchetes): magia 2 tamanho do cabeçalho 2 meta1, 2 meta2 2 início do segmento 2 meta3 2 PRIMEIRO SEGMENTO
No comments:
Post a Comment