¿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?
3 respuestas
Desde el punto de vista statusCode
, todos estos son idénticos:
- Llamando a
res.status(statusCode)
- Establecer la
res.statusCode
directamente - Pasar un código de estado a
res.writeHead(statusCode, ...)
- 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;
};
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.
Además de la respuesta de Jacob, response.status
no forma parte de la biblioteca estándar de NodeJS (consulte el docs), pero en realidad es un tercero
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.
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.