O Node.js é uma linguagem de back -end emergente projetada para ajudar os programadores a criar aplicativos escaláveis rapidamente. O Node.js tem muitos recursos atraentes e há inúmeros relatórios sobre isso. Este artigo analisará e discutirá os recursos do EventEmitter, Streams, Coding Style, Lineting, Coding Style e Other para ajudar os usuários a ter um entendimento mais profundo do Node.JS.
Como uma plataforma construída no tempo de execução do Chrome JavaScript, nosso entendimento relevante do JavaScript parece ser aplicável aos aplicativos de nó; Sem extensões ou modificações adicionais de idiomas, podemos aplicar a experiência da programação front-end à programação de back-end.
EventEmitter (remetente de eventos)
Primeiro de tudo, você deve entender o modelo de EventEmitter. Ele pode enviar um evento e um evento que interessará ao consumidor. Podemos pensar nisso como uma extensão do padrão de passe de retorno de chamada para uma função assíncrona. Em particular, o EventEmitter terá mais vantagem quando vários retornos de chamada forem necessários.
Por exemplo, um chamador envia uma solicitação de "arquivo de lista" para o servidor remoto. Você pode agrupar os resultados retornados e executar um retorno de chamada para cada grupo. O modelo de EventEmitter permite enviar retornos de chamada de "arquivo" em cada grupo e executar o processamento "final" quando todas as operações são concluídas.
Ao usar o EventEmitter, basta definir os eventos e parâmetros relevantes.
A cópia do código é a seguinte:
var eventEMitter = requer ('eventos'). EventEmitter;
var util = requer ('util');
function myclass () {
if (! (esta instância de myclass)) retorne novo myclass ();
EventEmitter.call (this);
var self = this;
setTimeout (função timeoutcb () {
self.emit ('MyEvent', 'Hello World', 42);
}, 1000);
}
util.Irits (myClass, EventEmitter);
O construtor MyClass cria um gatilho de tempo com um atraso de gatilho de 1s e um evento de gatilho de myevent. Para usar eventos relacionados, você precisa executar o método on ():
A cópia do código é a seguinte:
var myobj = new myclass ();
var start = date.now ();
myobj.on ('myevent', function myeventcb (str, num) {
console.log ('myevent acionou', str, num, date.now () - start);
});
Deve -se notar aqui que, embora o evento EventEmitter subscrito seja um evento assíncrono, quando o tempo acionar, as ações do ouvinte serão sincronizadas. Portanto, se o evento MyEvent acima tiver 10 ouvintes, todos os ouvintes serão chamados em ordem sem esperar o loop do evento.
Se uma subclasse do EventEmitter gerar um evento EMIT ('Error'), mas nenhum ouvinte se inscrever, a classe base do EventEmitter lança uma exceção, fazendo com que um evento invasivo a ser acionado quando o objeto de processo for executado.
Verror
O Verror é uma extensão do erro da classe base, que nos permite definir mensagens de saída usando o formato Printf Character.
Fluxos
Se houver um arquivo muito grande que precise ser processado, o método ideal deve ser para ler a peça e escrever parte. Não importa o tamanho do arquivo, ele sempre será processado enquanto o tempo permitir. Isso requer o conceito de streaming. Os fluxos são outro modelo amplamente usado no nó, no nó, uma implementação do EventEmitter. Fornece interfaces duplex legíveis, graváveis ou completas. É uma interface abstrata, e os eventos de operação regulares fornecidos incluem: legível, gravável, drenagem, dados, final e fechamento. Se pudermos usar pipelines para integrar efetivamente esses eventos, serão alcançadas interações mais poderosas.
Usando .pipe (), a nota pode se comunicar com a pressão de volta através do pipeline. Back-pressão significa: somente aqueles que podem ser escritos, ou apenas aqueles que podem ser lidos.
Por exemplo, agora enviamos dados de Stdin para um arquivo local e servidor remoto:
A cópia do código é a seguinte:
var fs = requer ('fs');
var net = requer ('net');
var localfile = fs.createWritSTerend ('localfile.tmp');
net.connect ('255.255.255.255', 12345, função (cliente) {
process.stdin.pipe (cliente);
process.stdin.pipe (LocalFile);
});
E se quisermos enviar dados para um arquivo local e usar o Gunzip para comprimir esse fluxo, podemos fazer isso:
A cópia do código é a seguinte:
var fs = requer ('fs');
var zlib = requer ('zlib');
process.stdin.pipe (zlib.createGunzip ()).
Se você quiser saber mais sobre o fluxo, clique aqui.
Fluxo de controle (controle do processo)
Como o JS possui conceitos funcionais, como objetos de primeira classe, fechamentos etc., é possível definir facilmente as permissões de retorno de chamada. Isso é muito conveniente ao prototipagem e pode integrar permissões lógicas sob demanda. Mas é fácil usar funções embutidas desajeitadas.
Por exemplo, queremos ler uma série de arquivos em ordem e depois executar uma tarefa:
A cópia do código é a seguinte:
fs.readfile ('FirstFile', 'utf8', function FirstCB (Err, FirstFile) {
doSomething (FirstFile);
fs.readfile ('SecondFile', 'utf8', função Secondcb (err, segundo arquivo) {
doSomething (segundo arquivo);
fs.readfile ('terceiro arquivo', 'utf8', função terceiracb (err, terceiro arquivo) {
doSomething (terceiro arquivo);
});
});
});
Os problemas com esse padrão são:
1. A lógica desses códigos é muito dispersa e desordenada, e os processos operacionais relacionados são difíceis de entender.
2. Nenhum erro ou exceção é tratado.
3. Os vazamentos de memória de fechamento em JS são muito comuns e difíceis de diagnosticar e detectar.
Se quisermos executar uma série de operações assíncronas em um conjunto de entrada, o uso de uma biblioteca de controle de processos é uma escolha mais inteligente. Vasync é usado aqui.
Vasync é uma biblioteca de controle de processos cujas idéias vêm de operações assíncronas. O que o torna especial é que ele permite que os consumidores visualizem e observem um determinado processo de tarefa. Esta informação é muito útil para estudar o processo de um certo erro.
Estilo de codificação (estilo de programação)
O estilo de programação é o tópico mais controverso, porque geralmente é casual. Todo mundo tem suas próprias preferências. É importante encontrar um estilo que se adapte a indivíduos e equipes. Alguma herança tradicional pode tornar a jornada de desenvolvimento dos nós um lugar melhor.
1. Nomeie a função
2. Tente nomear todas as funções.
3. Evite fechamentos
4. Não defina outras funções em uma determinada função. Isso reduz muitos acidentes inesperados de vazamento de memória de fechamento.
5 funções mais e menores
Embora o V8 JIT seja um motor poderoso, as funções menores e mais finas serão melhor combinadas com o V8. Além disso, se nossas funções forem todas pequenas e requintadas (cerca de 100 linhas), também agradeceremos ao lê -las e mantê -las.
Verifique o estilo programaticamente: mantenha a consistência do estilo e use uma ferramenta de verificação para aprimorá -la. Estamos usando o JSSTYLE.
LING (Verificação de código)
A ferramenta de fiapos pode executar a análise estática do código sem executar, verificando possíveis erros e riscos, como falta de declarações de quebra no caso de casos. O fiapo não é simplesmente equivalente à verificação de estilo, é mais destinado a análise de risco objetiva do que às opções de estilo subjetivo. Usamos o JavaScriptLint, que tem itens de verificação ricos.
Log (log)
Quando estamos programando e codificando, precisamos ter uma visão de longo prazo. Em particular, considere quais ferramentas usarem para depuração. O excelente primeiro passo é fazer um registro eficaz. Precisamos identificar as informações e ver o que recebe atenção especial durante a depuração e o que é usado para análise e pesquisa em tempo de execução. Recomenda -se usar Bunyan, uma biblioteca de log Node.js direta e o formato de saída de dados é JSON. Para mais informações, clique aqui.
Servidor cliente
Se um aplicativo tiver distribuído recursos de processamento, será mais atraente no mercado. Interfaces semelhantes podem ser descritas usando a API RESTful HTTP ou o TCP JSON original. Isso permite que os desenvolvedores combinem experiência no nó com ambientes de rede assíncronos, bem como o uso de fluxos com sistemas distribuídos e escaláveis.
Ferramentas comuns:
1. Restify
Simplificando, esta é uma ferramenta para construir serviços de descanso. Ele fornece um suporte de boa visualização e depuração, enquanto apoia Bunyan e Dtrace.
2. Rápido
O Fast é uma ferramenta leve que usa o TCP para processar mensagens JSON. O suporte ao DTRACE é fornecido, o que nos permite identificar rapidamente as características de desempenho dos clientes do servidor.
3. Fluxo de trabalho
O fluxo de trabalho é construído no Restify e pode definir processos de negócios para uma série de serviços remotos e APIs. Por exemplo: status de erro, tempo limite, reconexão, processamento de congestionamento etc.