¿Cuál es la diferencia entre los siguientes

response.status(200).send('Hello World!');

Y esto

response.writeHead(200, {'content-type':'application/json'}); 
response.end('Hello World!');

¿Cuál de estos debe usarse cuando?

6
user6184932 28 oct. 2019 a las 21:10

3 respuestas

La mejor respuesta

Desde el punto de vista statusCode, todos estos son idénticos:

  1. Llamando a res.status(statusCode)
  2. Establecer la res.statusCode directamente
  3. Pasar un código de estado a res.writeHead(statusCode, ...)
  4. Llamando a res.sendStatus(statusCode)

Para el statusCode en sí, todos hacen lo mismo que establecer la propiedad .statusCode. Ese valor de propiedad se usa siempre que la respuesta envía encabezados (que pueden ser inmediatamente o más tarde dependiendo de la opción que elija). Puede ver esto mirando el código fuente Express y http (referencias a continuación).

Llamar a res.status() y configurar res.statusCode solo establece la propiedad para su uso posterior.

Llamar a res.writeHead() establece la propiedad res.statusCode y luego hará que los encabezados se vacíen inmediatamente, en lugar de que su comportamiento normal de ser enviado a la cola se envíe más tarde. Pero, desde el punto de vista de statusCode, no hay diferencia.

Llamar a res.sendStatus() establece la propiedad res.statusCode y luego hará que la respuesta se envíe inmediatamente con solo encabezados, sin cuerpo. Esto se usa a menudo para respuestas que no necesitan cuerpo (redirecciones, códigos de error, etc.).


Para preguntas como esta, puede simplemente mirar el código fuente. Para .status(), vemos this :

res.status = function status(code) {
  this.statusCode = code;
  return this;
};

Luego, en el nodo X código} para un {{X código}} para {{ / a>, puede ver que llamar a .writeHead() usted mismo, simplemente termina configurando la misma propiedad this.statusCode antes de llamar a .end() para eliminar los encabezados y el resto de la respuesta:

Y, si luego mira el documento para http.ServerResponse, verá esto:

response.statusCode

Añadido en: v0.4.0

Predeterminado: 200

Cuando se usan encabezados implícitos (no se llama a response.writeHead () explícitamente), esta propiedad controla el código de estado que se enviará al cliente cuando se vacíen los encabezados.

Entonces, .status() es solo un método para configurar la propiedad statusCode, que es a lo que se enviará el valor de respuesta cuando los encabezados finalmente se envíen (en el futuro) y (desde el punto de vista de statusCode) es exactamente lo mismo que llamar a writeHead() y pasarle el estado.

Express está tratando de jugar a un nivel de abstracción un poco más alto, por lo que crearon un método para configurar statusCode por separado que se puede invocar en cualquier momento antes de establecer la respuesta.

4
jfriend00 29 oct. 2019 a las 20:54

response.status(...) asigna un código de estado que se usará en el futuro. Los encabezados no se envían hasta que se envía el cuerpo de respuesta.

response.writeHead(...) realmente pone en cola los encabezados de respuesta para que se envíen inmediatamente. Eso significa que ya no puede asignar encabezados o códigos de estado para esa respuesta después, ya que todos ellos ya se han enviado.

Por lo general, usaría el patrón anterior, pero .writeHead es útil si desea que el tiempo hasta el primer byte (TTFB) ocurra antes.

6
Jacob 28 oct. 2019 a las 18:16
58596251