ventajas que español desventajas caracteristicas node.js rest http express

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.


La referencia Express API cubre este caso.

Ver status y send .

En resumen, solo tiene que llamar al método de status antes de llamar a json o send :

res.status(500).send({ error: "boo:(" });


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

  1. cuerpo // contiene sus datos
  2. encabezados
  3. Okay
  4. estado
  5. statusText
  6. tipo
  7. 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);