Como melhorar seu serviço de API no node.js. Parte 1

Uma quantidade decente de material está disponível na gravação da API em node.js. A maioria deles está na forma de tutoriais e demonstrações na documentação. Isso é suficiente para descobrir e escrever rapidamente algo próprio. Mas eles raramente encontram detalhes de por que isso é feito dessa maneira. E alguns pontos são omitidos por simplicidade e brevidade.

Este artigo pretende preencher algumas lacunas que possam surgir e, finalmente, melhorar seu serviço no node.js.

PS Em nenhum caso me considero um especialista: há espaço para crescer. Mas, ao mesmo tempo, há algo a compartilhar.

Estrutura do arquivo do projeto


A estrutura do arquivo é uma coisa básica, mas muito importante. Ao criá-lo, vale a pena considerar a possibilidade de dimensionar o serviço; por esse motivo, não vale a pena colocar arquivos na estrutura plana de um diretório. Precisa de uma hierarquia, precisa de modularidade.

Ao nomear diretórios, você deve aderir aos padrões estabelecidos. Isso ajudará os colegas e em alguns meses a descobrir rapidamente onde e o que está localizado.

Exemplo de estrutura de arquivo

src/
    controllers/
         users/
             index.js
         index.js
    db/
         mongo/
             index.js
         index.js
    helpers/
    middlewares/
         auth.js
    models/
         users.js
    routes/
        users/
             index.js
        index.js
    index.js

.eslintrc
.gitignore
README.md
...
package.json

Notas:

  1. Todos os arquivos executáveis ​​devem estar localizados em ./src.
    Isso permitirá que você separe os arquivos de origem do datilografado ou babel compilado, que estará localizado em ./dist ou ./build.
    Isso também facilitará a configuração de linters e outras ferramentas configuráveis, pois os arquivos de destino estão localizados em um diretório separado.

  2. Coloque todas as entidades dos controladores e rotas em diretórios separados, o que permite abrir ./routes ou ./controller para ver apenas um arquivo index.js importando e exportando entidades de subdiretório.
    Isso permitirá que você navegue rapidamente pela funcionalidade existente, pois ela descreve apenas a interface de controladores ou roteadores sem se aprofundar na implementação.

Sobre a compilação Javascript


Obviamente, você não pode usar babel ou typescript para converter seu javascript. Como regra, os novos padrões ECMAScript acabam rapidamente no node.js, e você, com exceção do javascript baseado no navegador, pode controlar seu suporte.
Mas estou convencido de que vale a pena usar. E é por causa disso:

  1. A versão mais recente do Node.js nem sempre está disponível para produção.
  2. O Node.js (v. 13) ainda tem problemas com o suporte aos módulos do ECMAScript, embora eles apareçam e deixem o sinalizador, eles ainda são experimentais. Vender cedo.

Considere adicionar babel ao projeto:

Instale as dependências:

npm install @babel/core @babel/node @babel/preset-env --save-dev

Adicione o arquivo de configuração .babelrc à raiz do projeto
{
    "presets": [
      "@babel/preset-env"
    ]
}

Exemplo de Execução de Script
"start": "nodemon --exec babel-node src/index.js",

Notas:

  1. Ao instalar dependências, não esqueça de colocar a opção --save-dev (-D) apenas durante a fase de desenvolvimento. É necessário pelo menos para semântica.

Sobre a necessidade de linter


Vamos começar com o fato óbvio: linters são necessários. Nós escrevemos código, muito código. Muito disso, eles próprios não são capazes de controlar sua uniformidade. Este item é incrivelmente aprimorado no desenvolvimento da equipe.

E a uniformidade é a chave para a legibilidade do código.

A questão permanece sobre o rigor do linter. A escolha de qual deve ser baseada no tamanho da equipe, seu nível profissional, um critério importante é o próprio projeto.

Adicionando um linter simples ao projeto

Vamos instalar as dependências:

npm install eslint --save-dev

Adicione o arquivo de configuração .eslintrc à raiz do projeto:

{
    "env": {
        "node": true,
        "es6": true,
    },
    "extends": "eslint:recommended"
}

Como regra, essa configuração não é suficiente. Aqui você pode expandir as regras ou dar uma olhada nas opções mais rigorosas preparadas.

 ,  
...
    "extends": "eslint:recommended",
    "rules": {
        "quotes": ["error", "single"]
    }
}

Usando um linter mais rígido

Existem várias configurações populares baseadas nos mesmos guias de estilo.

  • Google

     npm install --save-dev eslint-config-google
    
  • Airbnb

     npm install --save-dev eslint-config-airbnb-base eslint-plugin-import
    
  • Idiomatic
     npm install --save-dev eslint-config-idiomatic
    

Assim, será necessário corrigir .eslintrc

{
    "env": {
        "node": true,
        "es6": true,
    },
    "extends": "google" | "airbnb-base" | "idiomatic"
}

Também é necessário adicionar o lançamento do linter a um script separado.

"lint": "eslint ./src --cache && echo \"eslint: no lint errors\"",
"lint:fix": "eslint ./src --fix && echo \"eslint: no lint errors\""

Sobre o lançamento do aplicativo


Qualquer pessoa que tenha acesso ao repositório do projeto deve poder executá-lo. Se ele pode fazer isso e quanto tempo levará para ele fazer isso é um dos critérios de qualidade do seu projeto.

É importante documentar antecipadamente como iniciar o serviço passo a passo no arquivo README.md, bem como prescrever comandos para as principais ações.

"start": "npm run dev",
"dev": "nodemon --exec babel-node ./src/index.js",
"build": "babel ./src --out-dir ./build",
"prod": "NODE_ENV=production node ./build/index.js",
"lint": "eslint ./src --cache && echo \"eslint: no lint errors\"",

Para usar os comandos acima, pode ser necessário instalar os seguintes pacotes:

npm install --save-dev @babel/cli nodemon babel-node

Nota:

  1. Se você adicionou os comandos básicos ao package.json, ainda descreva o processo de inicialização no README.md.

Conclusão


Inicialmente, o artigo queria cobrir muito mais recomendações sobre como escrever uma API no node.js, mas quero caber em 3-5 minutos. lendo o artigo. Sujeito a um bom feedback, uma sequência será lançada.

All Articles