Back-End

30 mai, 2017

As 8 dúvidas técnicas mais comuns sobre NodeJS

Publicidade

Plataforma nova, dúvidas novas. Como muita gente (inclusive eu) tem começado agora a desenvolver aplicações em Node.js, por diversos motivos que já elenquei em outros artigos, é comum que surjam dúvidas uma vez que é uma plataforma bem diferente do que as tradicionais C# e Java que muito de nós programam.

A ideia desse artigo é elencar as 8 principais dúvidas técnicas sobre Node.js. Caso esteja ainda mais cru do que eu na plataforma, recomendo ler primeiramente estes artigos:

As dúvidas que serão respondidas são:

  1. Qual a diferença entre til e circunflexo no packages.json?
  2. Como eu depuro programas Node.js?
  3. Qual é o propósito do module.exports e como eu uso ele?
  4. Como faço uso de todos meus processadores?
  5. Como ver completamente os objetos Node.js no console?
  6. Como executar Node.js como um serviço?
  7. Como enviar um email via Node.js?
  8. Como eu posso compartilhar código entre o servidor e o cliente?

Vamos lá!

1. Qual a diferença entre til e circunflexo no packages.json?

Então você abre o packages.json e rapidamente entende que as dependencies são os pacotes que sua aplicação usa, mas onde deveriam estar listadas as versões dos pacotes tem um monte de símbolos que não lhe dizem muita coisa…

Resumidamente, funciona assim:

  • O til garante que o pacote seja sempre carregado respeitando o número do meio da versão. Ex: ˜1.2.3 pega o pacote mais recente da versão 1.2.x, mas não vai atualizar para 1.3. Geralmente, garante que correções de bugs sejam atualizados no seu pacote.
  • O circunflexo garante que o pacote seja sempre carregado respeitando o primeiro número da versão. Ex: ˆ1.2.3 pega o pacote mais recente da versão 1.x, mas não vai atualizar para 2.0. Garante que bugs e novas funcionalidades do seu pacote sejam atualizados, mas não novas versões “major” dele.

A imagem abaixo ajuda a entender o template de versões dos pacotes do NPM, que aliás usa um padrão bem comum da indústria de software:

Outros símbolos incluem:

  • >, >=, <, <=1.0: a versão deve ser superior, superior ou igual, inferior, inferior ou igual à 1.0, respectivamente.
  • 1.2.x: equivalente a ˜1.2.0
  • *: qualquer versão do pacote
  • latest: a versão mais recente do pacote

Agora, se você não tiver símbolo algum, aí o pacote deve ser sempre carregado usando a versão especificada.

Uma dica bem valiosa aqui (quem não gosta de um bônus?) para quando se quer atualizar todos os pacotes é colocar * na versão de todos e rodar o comando “npm update –save” sobre a pasta do projeto.

2. Como eu depuro programas Node.JS?

Assim como o JS tradicional, em Node podemos usar qualquer editor de texto para programar nossas aplicações. No entanto, opções simplificadas demais como Notepad e editores de linha de comando (como nano), embora práticas de usar não são muito úteis quando precisamos depurar aplicações bugadas. Sendo assim, vou dar duas sugestões de como depurar programas Node.js.

Opção 1: troque seu editor de texto

O melhor jeito que eu faço atualmente é usando o Visual Studio Community (2015 com plugin para Node ou 2017 com suporte nativo). Nele você pode colocar breakpoints em arquivos .js, inspecionar variáveis, testar expressões no console e muito mais. E é uma ferramenta gratuita que roda em Windows e tem uma versão beta pra Mac.

Outra alternativa, mais leve, é o editor de texto Visual Studio Code, que vem com suporte nativo a Node.js. Também gratuito e roda em Windows, Mac e Linux.

Opção 2: use um depurador externo ao seu editor

Se você não quer abrir mão de usar editores de texto nativos do seu SO ou os mais clássicos que você já está acostumado, há algum tempo que você pode depurar seus programas Node.js diretamente no Google Chrome também, usando o F12. Você consegue mais informações neste post do Medium.

E por fim, uma outra alternativa para não largar seus editores de texto favoritos é usar o Node Inspector, um projeto open-source disponível no GitHub.

3. Qual é o propósito do module.exports e como eu o uso?

Em tutoriais simples que eu tenho no meu blog de como programar usando Node.js com MongoDB eu sempre recomendo criar um arquivo JS db.js com a lógica de conexão do banco de dados. Ao final do arquivo, sempre vemos um modulo.exports que recebe um objeto JSON. Mais tarde, damos um require nesse db.js pra poder usar a conexão internamente criada nele. Mas final, o que o module.exports faz?

Resumidamente, module.exports define qual objeto deste arquivo JS será exportado (ou exposto) quando uma chamada require for feita à ele. Ele é um análogo ao return do arquivo JS como um todo.

Um atalho do Node permite que você use apenas a palavra exports ao invés de module.exports.

Um exemplo de uso bem comum é para criar uma biblioteca de funções dentro de um arquivo JS que precisa ser chamada por outros arquivos JS. Considere o seguinte arquivo mymodule.js: