Sistema web de mural de spoilers em Node.js e React
A aplicação Spoilers consiste de uma API RESTful com as capacidades de cadastrar spoilers, bem como de uma aplicação cliente que consome os endpoints dessa API.
Projeto já adicionado aos favoritos. Clique aqui para ver todos seus favoritos
Obrigado pela sua avaliação, deixe o seu feedback nos comentários :D
src/app.js
const express = require('express')
const http = require('http')
const status = require('http-status')
const spoilersRoute = require('./routes/spoilers')
const sequelize = require('./database/database')
const app = express()
app.use(express.json())
app.use('/api', spoilersRoute)
app.use((request, response, next) => {
response.status(status.NOT_FOUND).send()
})
app.use((error, request, response, next) => {
response.status(status.INTERNAL_SERVER_ERROR).json({ error })
})
sequelize.sync({ force: true }).then(() => {
const port = process.env.PORT || 3000
app.set('port', port)
const server = http.createServer(app)
server.listen(port)
})
Visão geral
Programar com o Express consiste em criar uma aplicação com a declaração const app = express() e configurá-la para compreender os dados enviados em formato JSON, bem como responder ao cliente utilizando esse mesmo tipo de arquivo. Além disso, devemos informar ao framework quais são as rotas da aplicação, neste caso os endpoints da API, bem como a forma que ele tratará erros 404 e 500.
Comentários
Linhas 1 a 5: No início do arquivo app.js importamos todos os módulos necessários para a configuração do servidor HTTP e da aplicação Express, sobre a qual falamos a seguir. Não se preocupe agora com os módulos /routes/spoilers e /database/database porque eles serão criados em breve:
const express = require('express')
const http = require('http')
const status = require('http-status')
const spoilersRoute = require('./routes/spoilers')
const sequelize = require('./database/database')
Linha 7: Aqui criamos uma aplicação Express a partir de uma chamada a função express(), que importamos do módulo express:
const app = express();
Linha 9: Quando enviamos uma requisição para a API que contém um JSON em seu corpo, esses dados podem ser acessados em request.body, contudo, ele é undefined, por padrão. Para conseguirmos receber dados em formato JSON precisamos de um middleware que faça a conversão de texto para esse formato de dado. Aqui utilizamos a solução nativa do Express para essa conversão, obtida a partir de uma chamada para express.json():
app.use(express.json());
Linha 11: Nessa linha são registradas as rotas da aplicação. Para saber mais sobre esse ponto da aplicação consulte a documentação de roteamento aqui na documentação:
app.use("/api", spoilersRoute);
Linhas 13 a 15: Esse é o middleware de tratamento de erros 404 da aplicação. Sempre que uma requisição for feita para um recurso que não existe na API, esse middleware enviará para o cliente uma resposta vazia com o código HTTP 404 NOT FOUND:
app.use((request, response, next) => {
response.status(status.NOT_FOUND).send();
});
Linhas 17 a 19: Aqui temos o último middleware declarado na aplicação, o qual se destina ao tratamento de erros 500. Em qualquer outro middleware da aplicação, sempre que executamos a função next(), passando para ela um objeto, o Express entenderá que o middleware de erro deve ser invocado. O erro utilizado na função next() é passado para o primeiro parâmetro deste middleware. Com essa informação, retornamos para o cliente o código HTTP 500 INTERNAL SERVER ERROR, com um objeto que descreve o erro ocorrido e cuja primeira propriedade chama-se error:
app.use((error, request, response, next) => {
response.status(status.INTERNAL_SERVER_ERROR).json({ error });
});
Linhas 21 a 26. Nesse ponto, invocamos o método sync() do Sequelize para que os dados dos modelos declarados na aplicação sejam sincronizados com o banco de dados. O objeto passado como parâmetro, com a propriedade force, se encarrega de dizer se cada tabela deve ser recriada. Uma vez que sync() retorna uma promise, será no método then() desse objeto que faremos o servidor iniciar seu ciclo de execução:
sequelize.sync({ force: true }).then(() => {
const port = process.env.PORT || 3000;
app.set("port", port);
const server = http.createServer(app);
server.listen(port);
});
Saiba mais
Veja a Série Primeiros passos no Node.js