{"id":16620744,"url":"https://github.com/alphalawless/vanilla-nodejs-restapi","last_synced_at":"2026-05-30T22:31:26.244Z","repository":{"id":37242503,"uuid":"505606212","full_name":"AlphaLawless/vanilla-nodejs-restapi","owner":"AlphaLawless","description":"REST API feita com Vanilla Node.js 🟢","archived":false,"fork":false,"pushed_at":"2022-06-20T21:45:35.000Z","size":300,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-13T11:43:52.829Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlphaLawless.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-20T21:42:20.000Z","updated_at":"2022-06-20T21:42:40.000Z","dependencies_parsed_at":"2022-08-18T22:10:29.759Z","dependency_job_id":null,"html_url":"https://github.com/AlphaLawless/vanilla-nodejs-restapi","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AlphaLawless/vanilla-nodejs-restapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLawless%2Fvanilla-nodejs-restapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLawless%2Fvanilla-nodejs-restapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLawless%2Fvanilla-nodejs-restapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLawless%2Fvanilla-nodejs-restapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlphaLawless","download_url":"https://codeload.github.com/AlphaLawless/vanilla-nodejs-restapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlphaLawless%2Fvanilla-nodejs-restapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33712579,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T02:45:04.554Z","updated_at":"2026-05-30T22:31:26.223Z","avatar_url":"https://github.com/AlphaLawless.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Uma RestAPI Node.js Vanilla sem frameworks\n\nNode.js é um \"framework\" bastante popular do JavaScript. Ele acende muito quando usamos para construir serviços e APIs back-end. Desenvolvedores Node.js frequentemente utilizam [frameworks e bibliotecas](https://www.section.io/engineering-education/most-useful-nodejs-packages/) de código aberto como [Express.js](https://www.section.io/engineering-education/express/) para desenvolver suas aplicações. Essas bibliotecas estão prontamente disponíveis nos registros do NPM.\n\nEm qualquer momento que você for utilizar tais pacotes, existem muitas abstrações; por isso você não utiliza as funcionalidades nativas do Node.js. A lógica de baixo nível do Node.js da sua aplicação fica escondida de você com os processos desses pacotes e executa um Node.js puro por baixo dos panos.\n\nUma coisa importante para observar é que esses pacotes fazem o [Node.js uma tecnologia popular](https://www.section.io/engineering-education/why-node-js-is-popular/). Por outro lado, você pode optar em usar o Node.js puro para desenvolver suas aplicações. Dessa forma, você faz uso das funcionalidades do [Vanilla Node.js](https://www.section.io/engineering-education/pure-node-js-no-frameworks-or-packages/). Esse artigo vai ensinar a você como usar o vanilla Node.js sem frameworks para construir APIs simples.\n\n## Objetivos\n\nNesse guia, você vai construir uma REST API simples usando funcionalidades nativas do Node.js. Nós vamos\napenas usar a camada que compõe o [vanilla Node.js](https://nodejs.dev/learn) com o [módulo HTTP](https://nodejs.org/api/http.html#http_http) para criar e gerenciar um server.\n\nIsso significa que não vamos usar o NPM. Portanto o NPM não vai precisar gerenciar dependências, sem `package.json`, sem `package-lock.json` e sem a pasta `node_modules`.\n\nO objetivo é mostrar para você como o Node.js funciona em sua forma mais pura e como você pode usá-lo sem bibliotecas\nou frameworks.\n\n\u003e Nota: Quando trabalhando em um projeto real, é uma boa prática usar bibliotecas e pacotes Node.js. Dessa forma, você vai receber muitas vantagens com códigos prontamente disponiveis que fazem seu workflow de desenvolvimento mais fácil e rápido.\n\n## Pre-requisitos\n\n- Garantir que você tem o [Node.js](https://nodejs.org/en/) e [Postman](https://www.postman.com)/[Insomnia](https://insomnia.rest/download) instalado na sua máquina.\n- Está familiarizado em como usar o Postman ou Insomnia.\n- Conhecimentos básicos sobre o Node.js.\n- Entendimento básico de [REST APIs](https://www.section.io/engineering-education/rest-api/) e [Operações de CRUD](https://www.section.io/engineering-education/mysql-with-node-js/).\n- Entendimento básico de [JavaScript](https://eloquentjavascript.net). Esse guia usa recursos e sintaxes do [ES6](https://www.javascripttutorial.net/es6/) ([guia original](https://262.ecma-international.org/6.0/)), tal como as [arrow functions](https://www.section.io/engineering-education/how-to-use-javascript-arrow-functions-and-this-keyword/) (=\u003e).\n\n## Configurando um servidor HTTP simples\n\nAntes de criar uma REST API, vamos criar uma simples [API HTTP](https://nodejs.org/en/docs/guides/getting-started-guide/) para servir uma resposta como **E aí?**.\n\nCriando a pasta do projeto e um arquivo `app.js`.\n\n1. A primeira coisa que vamos fazer é puxar o [módulo HTTP](https://nodejs.org/api/http.html#http_http) do Node.js o método `require()`. Esse módulo é nativo do Node.js. Você não precisa de nenhum pacote extra ou biblioteca para acessá-lo, apenas o Node.js instalado em sua máquina.\n```js\nconst http = require(\"http\");\n```\nDessa forma, vamos fazer métodos necessários e funções disponíveis para configurar um server.\n\n2. Uma vez feito isso, vamos definir uma porta para qual nosso server vai rodar, como mostrado abaixo.\n```js\nconst PORT = process.env.PORT || 5000;\n```\n3. Para criar o server, você precisa chamar o método `createServer` do módulo HTTP. Por exemplo, `http.createServer`. Passe uma resposta e uma requisição que forneça suas informações.\n\nEntão use:\n\n- `req.url` para definir a requisição para acessar a rota/URL.\n- `req.method`\n- `res.writeHead` para definir alguma resposta nos cabeçalhos.\n- `res.write()` para enviar um conteúdo para a resposta atual.\n- `res.end()` para enviar a resposta.\n-\n```js\nconst server = http.createServer(async (req, res) =\u003e {\n    if (req.url === \"/api\" \u0026\u0026 req.method === \"GET\") {\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.write(\"E aí! Essa é uma API em Vanilla Node.js\") ;\n        res.end();\n    } else {\n        res.write(400, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify({ message: \"Rota não encontrada\" }));\n    }\n});\n```\n4. Chame o método `listen()` e passe uma `PORT `válida. Então adicione uma mensagem ao `console.log()` que vai indicar que o servidor está rodando.\n```js\nserver.listen(PORT, () =\u003e {\n    console.log(`Servidor iniciado na URL -\u003e http://localhost:${PORT}`)\n})\n```\n5. O server está pronto. Execute `node app.js` e teste-o. Isso vai informar aquela mensagem no `console.log()` em sua tela de comando.\n```\n$ node app.js\nServidor iniciado na URL -\u003e http://localhost:5000\n```\n6. Se você abrir `http://localhost:5000/api` em seu navegador, você vai receber a resposta que foi definida em `res.write()`.\n\n![Resposta da API](./.github/api-http.png)\n\n## Configurando a REST API\n\nVamos agora ver como configurar a REST API usando o Node.js puro. Vamos usar um modelo de todo para demonstrar isso.\n\nAbaixo vamos ver a estrutura do projeto.\n```\n\\---vanilla-restapi-node\n|   app.js\n|   controller.js\n|   data.js\n|   utils.js\n```\n\n### Adicionando dados para teste\n**data.js**: guarda alguns dados temporários para teste. A informação é mantida em um array chamado `todos`. Toda to-do tem um id único, um titulo, uma pequena descrição e um valor Booleano que marca a to-do como completa.\n```js\n// data.js\n/** Todos List */\nconst todos = [\n    {\n        id: 1,\n        title: \"Codar em JavaScript\",\n        description: \"Trabalhando com funções em JavaScript\",\n        completed: false,\n    },\n    {\n        id: 2,\n        title: \"Cozinhar uma sopa\",\n        description: \"Preparando um arroz e frango\",\n        completed: false,\n    },\n    {\n        id: 3,\n        title: \"Fazer uma caminhada\",\n        description: \"Passar um tempo no parque\",\n        completed: false,\n    },\n    {\n        id: 4,\n        title: \"Assistir Netflix\",\n        description: \"Aproveitar uma nova serie promissora\",\n        completed: false,\n    },\n];\nmodule.exports = todos;\n```\n### Configurando os controllers\n**controllers.js**: esse gerencia as funcionalidades atuais e a lógica por trás de cada rota usada na aplicação. Ele é criado de uma classe chamada `Controller`, que vai ter os seguintes métodos principais HTTP:\n\n- `getTodos()`: pega a lista com as todas as todos como listado no arquivo temporário `data.js`.\n- `getTodo()`: pega e lista um único to-do pelo id único.\n- `createTodo()`: cria uma nova to-do temporária.\n- `updateTodo()`: atualiza o valor em uma to-do existente.\n- `deleteTodo`: remove uma to-do da lista.\n```js\n// controller.js\nconst data = require(\"./data\");\n\nclass Controller {\n    async getTodos() {\n        return new Promise((resolve, _) =\u003e resolve(data));\n    }\n\n    async getTodo(id) {\n        return new Promise((resolve, reject) =\u003e {\n            let todo = data.find((todo) =\u003e todo.id === parseInt(id));\n            if (todo) {\n                resolve(todo);\n            } else {\n                reject(`Todo com o id ${id} não encontrado`);\n            }\n        });\n    }\n\n    async createTodo(todo) {\n        return new Promise((resolve, _) =\u003e {\n            let newTodo = {\n                id: Math.floor(4 + Math.random() * 10),\n                ...todo,\n            };\n\n            resolve(newTodo);\n        });\n    }\n\n    async updateTodo(id) {\n        return new Promise((resolve, reject) =\u003e {\n            let todo = data.find((todo) =\u003e todo.id === parseInt(id));\n            if (!todo) {\n                reject(`Nenhum todo com o id ${id} encontrado`);\n            }\n            todo[\"completed\"] = true;\n            resolve(todo);\n        });\n    }\n\n    async deleteTodo(id) {\n        return new Promise((resolve, reject) =\u003e {\n            let todo = data.find((todo) =\u003e todo.id === parseInt(id));\n            if (!todo) {\n                reject(`Nenhum todo com o id ${id} encontrado`);\n            }\n            resolve(`Todo deleted successfully`);\n        });\n    }\n}\nmodule.exports = Controller;\n```\n### Configurando os utilitários\n**utils.js**: controla um caso de uso padrão de API Web. Inclui a função `getReqData()`, que recupera dados do cliente no servidor.\n```js\n// utils.js\nfunction getReqData(req) {\n    return new Promise((resolve, reject) =\u003e {\n        try {\n            let body = \"\";\n            req.on(\"data\", (chunk) =\u003e {\n                body += chunk.toString();\n            });\n            req.on(\"end\", () =\u003e {\n                resolve(body);\n            });\n        } catch (error) {\n            reject(error);\n        }\n    });\n}\nmodule.exports = { getReqData };\n```\n### Configurando o server e rotas\n**app.js**: Aqui contém isso:\n\n- Inicialização e configuração do server.\n- As rota apropriadas escutando os vários métodos HTTP de um server.\n- Um número de `PORT` para escutar e definir o servidor ao vivo em um navegador.\n```js\n// app.js\nconst http = require(\"http\");\nconst Todo = require(\"./controller\");\nconst { getReqData } = require(\"./utils\");\n\nconst PORT = process.env.PORT || 5000;\n\nconst server = http.createServer(async (req, res) =\u003e {\n    // /api/todos : GET\n    if (req.url === \"/api/todos\" \u0026\u0026 req.method === \"GET\") {\n        const todos = await new Todo().getTodos();\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify(todos));\n    }\n\n    // /api/todos/:id : GET\n    else if (req.url.match(/\\/api\\/todos\\/([0-9]+)/) \u0026\u0026 req.method === \"GET\") {\n        try {\n            const id = req.url.split(\"/\")[3];\n            const todo = await new Todo().getTodo(id);\n            res.writeHead(200, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify(todo));\n        } catch (error) {\n            res.writeHead(404, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify({ message: error }));\n        }\n    }\n\n    // /api/todos/:id : DELETE\n    else if (req.url.match(/\\/api\\/todos\\/([0-9]+)/) \u0026\u0026 req.method === \"DELETE\") {\n        try {\n            const id = req.url.split(\"/\")[3];\n            let message = await new Todo().deleteTodo(id);\n            res.writeHead(200, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify({ message }));\n        } catch (error) {\n            res.writeHead(404, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify({ message: error }));\n        }\n    }\n\n    // /api/todos/:id : UPDATE\n    else if (req.url.match(/\\/api\\/todos\\/([0-9]+)/) \u0026\u0026 req.method === \"PATCH\") {\n        try {\n            const id = req.url.split(\"/\")[3];\n            let updated_todo = await new Todo().updateTodo(id);\n            res.writeHead(200, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify(updated_todo));\n        } catch (error) {\n            res.writeHead(404, { \"Content-Type\": \"application/json\" });\n            res.end(JSON.stringify({ message: error }));\n        }\n    }\n\n    // /api/todos/ : POST\n    else if (req.url === \"/api/todos\" \u0026\u0026 req.method === \"POST\") {\n        let todo_data = await getReqData(req);\n        let todo = await new Todo().createTodo(JSON.parse(todo_data));\n        res.writeHead(200, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify(todo));\n    }\n\n    // Nenhuma rota presente\n    else {\n        res.writeHead(404, { \"Content-Type\": \"application/json\" });\n        res.end(JSON.stringify({ message: \"Rota não encontrada\" }));\n    }\n});\n\nserver.listen(PORT, () =\u003e {\n    console.log(`Servidor iniciado na URL -\u003e http://localhost:${PORT}`);\n});\n```\n## Testando a aplicação\n\nUma REST API em Vanilla Node.js está agora configurada e pronta para teste e ver se tudo está funcionando. Agora você precisa iniciar o server rodando o seguinte comando:\n```\nnode app.js\n```\nIsso vai definir e inicia o server na porta 5000.\n```\n$ node app.js\nServidor iniciado na URL -\u003e http://localhost:${PORT}\n```\n\nA partir daqui você pode usar o **Insomnia** ou o **Postman** para testar a aplicação. Mas para deixar ela bem mais clara quem não tem muita familiaridade com esses clients. Acesse a pasta `/public` e lá, em um terminal, use o seguinte comando:\n```\nnpx serve\n```\nAssim, você pode acessar a URL que vai aparecer no prompt para você ver as rotas e suas funcionalidades com mais detalhes.\n\n## Aviso\n\nEsse guia foi feito e inspirado no material disponível pela desenvolvedora [Rose Waitherero](https://www.section.io/engineering-education/authors/rose-waitherero/). O artigo original está [aqui](https://www.section.io/engineering-education/a-raw-nodejs-rest-api-without-frameworks-such-as-express/).\n\n## Licença\n\n[MIT License](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphalawless%2Fvanilla-nodejs-restapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falphalawless%2Fvanilla-nodejs-restapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falphalawless%2Fvanilla-nodejs-restapi/lists"}