Estoy jugando con Nodejs y expreso construyendo una pequeña API de descanso. Mi pregunta es, ¿cuál es la mejor práctica / mejor manera de configurar el estado del código, así como los datos de respuesta?
Permítanme explicarlo con un poco de código (no pondré el nodo y el código expreso necesario para iniciar el servidor, solo los métodos de enrutador que conciernen):
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];
}
};
El siguiente código funciona perfectamente, y cuando envío una solicitud con Postman, obtengo el siguiente resultado:
Como puede ver, el estado muestra 200, que está bien. ¿Pero es esta la mejor manera de hacer esto? ¿Hay algún caso en el que deba establecer el estado yo mismo, así como el JSON devuelto? ¿O es eso siempre manejado por expreso?
Por ejemplo, acabo de hacer una prueba rápida y modifiqué ligeramente el método get anterior:
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 puede ver, si el usuario no se encuentra en la matriz, solo estableceré un estado de 404.
Los recursos / consejos para aprender más sobre este tema son más que bienvenidos.
Respuestas:
La referencia Express API cubre este caso.
Ver estado y enviar .
En resumen, solo tiene que llamar al
status
método antes de llamarjson
osend
:fuente
res.sendStatus(400);
res.sendStatus(400);
envía una cadena de datos, es equivalente ares.status(400).send('Not Found')
Podrías hacerlo de esta manera:
Esto establecerá el código de estado HTTP en 400, funciona incluso en express 4.
fuente
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Entonces,res.status(400).json(json_response)
sería preciso hoy en día.res.status(500).send({ error: "boo:(" });
estado 200 será el predeterminado cuando se utiliza
res.send
,res.json
etc.Puedes establecer el estado como
res.status(500).json({ error: 'something is wrong' });
A menudo haré algo como ...
Luego, haga que mi middleware de error envíe la respuesta y haga cualquier otra cosa que deba hacer cuando haya un error.
Además:
res.sendStatus(status)
se ha agregado a partir de la versión 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusfuente
Una lista de códigos de estado HTTP
La buena práctica con respecto a la respuesta de estado es, previsiblemente, enviar el código de estado HTTP adecuado dependiendo del error (4xx para errores del cliente, 5xx para errores del servidor), con respecto a la respuesta JSON real no hay "biblia", pero una buena idea podría ser para enviar (nuevamente) el estado y los datos como 2 propiedades diferentes del objeto raíz en una respuesta exitosa (de esta manera le está dando al cliente la oportunidad de capturar el estado de los encabezados HTTP y la carga útil en sí) y una tercera propiedad que explica el error de una manera comprensible para el ser humano en el caso de un error.
La API de Stripe se comporta de manera similar en el mundo real.
es decir
Okay
Error
fuente
Estoy usando esto en mi aplicación Express.js:
fuente
La forma estándar de obtener HttpResponse completo que incluye las siguientes propiedades
En el backend , haz esto
En Frontend, por ejemplo
Angular
, en , solo haz:fuente
fuente
fuente
Podrías hacer esto
fuente
La mejor manera de enviar una respuesta de error sería
return res.status(400).send({ message: 'An error has occurred' })
.Luego, en tu interfaz puedes atraparlo usando algo como esto:
Simplemente el inicio de sesión
err
no funcionará, ya que su objeto de mensaje enviado resideerr.response.data
.¡Espero que ayude!
fuente