Estou brincando com o Nodejs e expresso criando uma pequena API de descanso. Minha pergunta é: qual é a melhor prática / melhor maneira de definir o status do código, bem como os dados de resposta?
Deixe-me explicar com um pouco de código (não colocarei o nó e o código expresso necessário para iniciar o servidor, apenas os métodos do roteador):
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
O código abaixo funciona perfeitamente e, ao enviar uma solicitação com o Postman, recebo o seguinte resultado:
Como você pode ver, o status mostra 200, o que está OK. Mas essa é a melhor maneira de fazer isso? Existe um caso em que eu próprio precise definir o status, bem como o JSON retornado? Ou isso é sempre tratado por expresso?
Por exemplo, acabei de fazer um teste rápido e modifiquei levemente o método get acima:
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
Como você pode ver, se o usuário não for encontrado na matriz, apenas definirei o status 404.
Recursos / conselhos para aprender mais sobre este tópico são bem-vindos.
Respostas:
A referência da API Express cobre esse caso.
Veja o status e envie .
Em resumo, você só precisa chamar o
status
método antes de chamarjson
ousend
:fonte
res.sendStatus(400);
res.sendStatus(400);
enviar um dados de cadeia também, é equivalente ares.status(400).send('Not Found')
Você poderia fazer assim:
Isso definirá o código de status HTTP para 400, ele funciona mesmo no express 4.
fonte
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Então,res.status(400).json(json_response)
seria preciso hoje em dia.res.status(500).send({ error: "boo:(" });
status do 200 será o padrão quando se utiliza
res.send
,res.json
etc.Você pode definir o status como
res.status(500).json({ error: 'something is wrong' });
Muitas vezes eu vou fazer algo como ...
Depois, meu middleware de erro envia a resposta e faz qualquer outra coisa que preciso fazer quando há um erro.
Adicionalmente:
res.sendStatus(status)
foi adicionado na versão 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusfonte
Uma lista de códigos de status HTTP
A boa prática em relação à resposta de status é, previsivelmente, enviar o código de status HTTP adequado, dependendo do erro (4xx para erros do cliente, 5xx para erros do servidor), em relação à resposta JSON real, não há "bíblia", mas uma boa idéia pode ser para enviar (novamente) o status e os dados como duas propriedades diferentes do objeto raiz em uma resposta bem-sucedida (dessa forma, você está dando ao cliente a chance de capturar o status dos cabeçalhos HTTP e da própria carga útil) e uma terceira propriedade explicando o erro de uma maneira compreensível ao ser humano no caso de um erro.
A API do Stripe se comporta de maneira semelhante no mundo real.
ie
Está bem
Erro
fonte
Estou usando isso no meu aplicativo Express.js:
fonte
A maneira padrão de obter o HttpResponse completo que inclui as seguintes propriedades
No back - end , faça isso
No Frontend, por exemplo
Angular
, faça:fonte
fonte
fonte
Você poderia fazer isso
fonte
A melhor maneira de enviar uma resposta de erro seria
return res.status(400).send({ message: 'An error has occurred' })
.Então, no seu front-end, você pode capturá-lo usando algo como isto:
Apenas o log
err
não funcionará, pois o objeto da mensagem enviada resideerr.response.data
.Espero que ajude!
fonte