Web API feita em Node.js puro com testes End to End sem necessidade de qualquer framework ou biblioteca.
- Node@20.9.0
npm run dev
: sobe o servidor.npm run test
ounpm t
: sobe o servidor e roda os testes e2e.npm run test:dev
: sobe o servidor e roda os testes e2e em watch mode.
npm init -y
: inicializa um novo projetonpm t
: roda os testesnode --watch [arquivo]
: roda o projeto e observa o arquivo se for modificado para atualzar.node --test --watch [arquivo]
: roda os testes e observa se o arquivo for modificado para atualizar."type": "module"
: permite utilizar ESModules (import, export, etc.) ao invés de CommonJS (module.exports, const x = import(...)).
curl localhost:3000
: faz uma requisição HTTP direto do terminal
createServer(handler)
: função nativa que cria um servidor com request e response. Todo o back end pode ser feito a partir do pacotehttp
do próprio node.- A função
fetch()
pode ser usada para fazer requisições no ambiente de testes e substituir a bibliotecasupertest
. - A função
node:event.once()
é um listener que aguarda por um evento ser emitido. No exemploawait once(request, "data")
diz o programa para esperar até que o evento "data" seja emitido pelo request. É equivalente a:
request
.on('data', chunk => {
body.push(chunk);
})
.on('end', () => {
// ...
});
O javascript nativamente não possui uma análise de código, então é utilizado o pacote eslint para isso:
npx eslint .
: Faz a análise de todo o código do projeto, indicando erros e avisos (no-unused-vars
,no-undef
, ...).
JSDoc é uma ferramenta utilizada para fazer a tipagem de variáveis, objetos e funções sem precisar de TypeScript.
- Para variáveis que possuem a tipagem vinda de pacotes, importar a tipagem desta maneira para evitar conflitos:
/** @type {import("node:http").Server} */
let _server = {};
- Para fazer a tipagem de variáveis atribuídas via desestruturação (destructuring assignment):
/** @type {{ description: string, price: string }} */
const { description, price } = JSON.parse(await once(request, "data"));
No exemplo acima, description
e price
são do tipo string
.
Ao fazer a tipagem de uma função (uma rota por exemplo) como ResquestListener
:
import { createServer, RequestListener } from "node:http";
/** @type {RequestListener} */
async function handler(request, response) {
// ...
}
E subir o servidor, ocorre este erro:
import { createServer, RequestListener } from "node:http";
^^^^^^^^^^^^^^^
SyntaxError: The requested module 'node:http' does not provide an export named 'RequestListener'
Para corrigi-lo, retire o RequestListener
dos import:
import { createServer } from "node:http";
/** @type {import("node:http").RequestListener} */
async function handler(request, response) {
// ...
}