Tratamento de Erros
É muito importante que as aplicações tenham um tratamento de erros adequado. As aplicações precisam ser capazes de responder por rotas não encontradas ou erros inesperados.
O protoloco HTTP possui códigos específicos para informar o status da resposta de uma determinada requisição. Os intervalos de status mais utilizados são:
- 200-299 - Respostas de sucesso
- 400-499 - Respostas de erro do Cliente
- 500-599 - Respostas de erro do Servidor
Para mais informações sobre HTTP Status, acesse MDN - HTTP Status.
Os 03 status mais comuns utilizados são:
200 OK
O status 200 OK (Sucesso) indica que a requisição foi bem sucedida.
404 Not Found
O status 404 Not Found (Não Encontrado) indica que o servidor não encontrou o recurso solicitado.
500 Internal Server Error
O status 500 Internal Server Error (Erro Interno do Servidor) indica que o servidor encontrou um erro inesperado e não conseguiu atender a requisição.
Criando o módulo de tratamento de erros
Para criar o módulo de tratamento de erros, crie o arquivo error.js
.
/* eslint no-unused-vars: 0 */
// importar o módulo de registro de aplicações
const logger = require('./logger');
// definir a função que fará o tratamento do erro 404
module.exports.notFound = (req, res, next) => {
// registrar o erro no log
logger.warn('Não encontrado');
// criar o erro personalizado
const error = new Error('Not Found');
error.status = 404;
// passar o objeto `error` para o próximo middleware
next(error);
};
// definir a função que fará o tratamento do erro 500
module.exports.catchAll = (err, req, res, next) => {
// verificar se é um erro conhecido ou um erro inesperado
const status = err.status || 500;
const message = err.message || 'Something broke!';
// registrar o erro no log
logger.error(message);
// retornar o erro na resposta
res.status(status).json({ error: { status, message } });
};
Integração com o Express
Para integrar o módulo de tratamento de erros no Express, edite o arquivo app.js
.
const bodyParser = require('body-parser');
const compression = require('compression');
const cors = require('@robertoachar/express-cors');
const express = require('express');
const helmet = require('helmet');
const { catchAll, notFound } = require('./error'); // importar o módulo de tratamento de erros
const app = express();
app.use(helmet());
app.use(compression());
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.get('/', (req, res) => res.json({ message: 'Hello Express' }));
app.use(notFound); // utilizar o tratamento de erro 404
app.use(catchAll); // utilizar o tratamento de erro 500
module.exports = app;
O tratamento de erros no Express deve ser configurado após todas as outras rotas. Isso faz parte da arquitetura do Express. Primeiro deve ser feito o tratamento para o erro 404
e por último o tratamento para o erro 500
.
Para mais informações sobre o tratamento de erros no Express, acesse http://expressjs.com/pt-br/guide/error-handling.html.
Entendendo o tratamento de erros
Abra o Postman e faça uma requisição GET
em http://localhost:3000/hello
. O resultado deve ser o erro 404 Not Found
, pois essa rota não existe.
{
"error": {
"status": 404,
"message": "Not Found"
}
}
Edite o arquivo app.js
, crie outra rota logo abaixo da rota /
, e dispare um erro propositalmente.
...
app.get('/', (req, res) => res.json({ message: 'Hello Express' }));
// rota hello
app.get('/hello', (req, res) => {
throw new Error('Deu pau');
});
...
Abra o Postman e faça uma requisição GET
em http://localhost:3000/hello
. O resultado deve ser o erro 500 Internal Server Error
, pois disparamos um erro proposital.
{
"error": {
"status": 500,
"message": "Deu pau"
}
}
Edite novamente o arquivo app.js
e altere a rota /hello
.
app.get('/', (req, res) => res.json({ message: 'Hello Express' }));
// rota hello
app.get('/hello', (req, res) => res.json({ message: 'Hello Express' }));
Abra o Postman e faça uma requisição GET
em http://localhost:3000/hello
. O resultado deve ser o status 200 OK
, pois o Express encontrou a rota e conseguiu processar a requisição.
{
"message": "Hello Express"
}
Dica
Pode apagar a rota /hello
pois não faz parte do escopo da aplicação.
Mundo Real
O tratamento de erros é muito importante para informar ao cliente qual o status da requisição. O status 404
é totalmente diferente do status 500
. Isso precisa estar muito bem definido na aplicação.
Não retorne a mensagem de erro real da aplicação para o cliente. Essa mensagem pode conter informações sensíveis ou detalhes importantes da implementação de alguma funcionalidade da aplicação.
Retorne uma mensagem genérica e registre a mensagem de erro. Dessa forma você é capaz de entender o que aconteceu (ou não) e as informações da aplicação ficam protegidas.
Caso o registro da aplicação apresente a mensagem de erro genérica, é sinal de que faltou tratamento de erro em algum local da aplicação.
Resumo
- Implementamos o módulo de tratamento de erros
- Entendemos o conceito e a importância do tratamento de erros
- Entendemos as implicações de retornar mensagens de erros reais para o cliente