node.js - que - Forma correcta de establecer el estado de respuesta y el contenido JSON en una API REST hecha con nodejs y express
mongodb español (8)
Estoy usando esto en mi aplicación Express.js:
app.get(''/'', function (req, res) {
res.status(200).json({
message: ''Welcome to the project-name api''
});
});
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.
Podrías hacerlo de esta manera:
res.status(400).json(json_response);
Esto establecerá el código de estado HTTP en 400, funciona incluso en express 4.
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 según el 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.
Stripe''s API Stripe''s comporta de manera similar en el mundo real.
es decir
Okay
200, {status: 200, data: [...]}
Error
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
el estado de 200 será el predeterminado cuando use
res.send
,
res.json
, etc.
Puede establecer el estado como
res.status(500).json({ error: ''something is wrong'' });
A menudo haré algo como ...
router.get(''/something'', function(req, res, next) {
// Some stuff here
if(err) {
res.status(500);
return next(err);
}
// More stuff here
});
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.sendStatus
La forma estándar de obtener HttpResponse completo que incluye las siguientes propiedades
- cuerpo // contiene sus datos
- encabezados
- Okay
- estado
- statusText
- tipo
- url
En el backend, haz esto
router.post(''/signup'', (req, res, next) => {
// res object have its own statusMessage property so utilize this
res.statusText = ''Your have signed-up succesfully''
return res.status(200).send(''You are doing a great job'')
})
si desea recibir, por ejemplo, en la aplicación
Angular
, simplemente haga:
let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
observe: ''response'' // remember to add this, you''ll get pure HttpResponse
}).subscribe(response => {
console.log(response)
})
try {
var data = {foo: "bar"};
res.json(JSON.stringify(data));
}
catch (e) {
res.status(500).json(JSON.stringify(e));
}
res.status(500).jsonp(dataRes);