¿Cuál es la diferencia entre res.end () y res.send ()?

141

Soy un principiante Express.jsy estoy confundido por estas dos palabras clave: res.end()y res.send().

¿Son iguales o diferentes?

sudheeshcm
fuente
1
Creo que es res.endusado por nodo simple donde res.sendes usado por framwork express
Muhammad Umer Idreesi

Respuestas:

130

res.send()enviará la respuesta HTTP. Su sintaxis es,

res.send([body])

El parámetro body puede ser un objeto Buffer, una cadena, un objeto o una matriz. Por ejemplo:

res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });

Vea esto para más información.

res.end()finalizará el proceso de respuesta. Este método en realidad proviene del núcleo del nodo, específicamente el response.end()método de http.ServerResponse. Se utiliza para finalizar rápidamente la respuesta sin ningún dato. Por ejemplo:

res.end();
res.status(404).end();

Lea esto para más información.

itzmebibin
fuente
68
Pero res.end en realidad puede actuar como res.send, en el sentido de que puede pasar un argumento de cadena para agregar como cuerpo de respuesta. Además de eso, res.send también finaliza la respuesta. Entonces, ¿cómo son funcionalmente diferentes?
saltthehash
31
@ psytech140 Jmar77 tuvo una buena respuesta aquí : "Si pasa una cadena a res.send (), automáticamente asume un tipo de contenido de html. res.end (), sin embargo, simplemente llama a la implementación end () subyacente del nodo en el flujo de respuesta, por lo que no se hacen suposiciones para el tipo de contenido ".
abagh0703
Tuve que votar esto puramente porque nunca lo he usado, expresspero por el pensamiento del título: uno envía algo, uno termina algo ... era correcto.
Darren Bartrup-Cook
Pero, ¿y si lo usas res.send()sin nada? ¿Esto actúa como res.end()?
CMCDragonkai
Vea la diferencia en la respuesta a continuación y lo que sucedió bajo el capó
KunYu Tsai
108

Me gustaría hacer un poco más de énfasis en algunas diferencias clave entre res.end()y res.send()con respecto a los encabezados de respuesta y por qué son importantes.

1. res.send () verificará la estructura de su salida y establecerá la información del encabezado en consecuencia.


    app.get('/',(req,res)=>{
       res.send('<b>hello</b>');
    });

ingrese la descripción de la imagen aquí


     app.get('/',(req,res)=>{
         res.send({msg:'hello'});
     });

ingrese la descripción de la imagen aquí

Donde con res.end () solo puede responder con texto y no establecerá " Content-Type "

      app.get('/',(req,res)=>{
           res.end('<b>hello</b>');
      }); 

ingrese la descripción de la imagen aquí

2. res.send () establecerá el atributo "ETag" en el encabezado de respuesta

      app.get('/',(req,res)=>{
            res.send('<b>hello</b>');
      });

ingrese la descripción de la imagen aquí

¿Por qué es importante esta etiqueta?
El encabezado de respuesta HTTP ETag es un identificador para una versión específica de un recurso. Permite que los cachés sean más eficientes y ahorra ancho de banda, ya que un servidor web no necesita enviar una respuesta completa si el contenido no ha cambiado.

res.end() NO establecerá este atributo de encabezado

Jorge González
fuente
44
Esta será una respuesta aceptada en mi opinión ... se hace más hincapié en las diferencias reales que pueden arruinar su día de trabajo en lugar de la discusión sobre finalizar la respuesta con / sin contenido ...
Tomás
13

lo que res.send () hace es implementar res.write , res.setHeaders y res.end .
comprueba los datos que envía y establece los encabezados correctos,

luego transmite los datos con res.write, y al final usa res.end para establecer el final de la solicitud.

Hay algunos casos en los que querrá hacerlo manualmente, por ejemplo, si desea transmitir un archivo o un gran conjunto de datos, en este caso, querrá configurar los encabezados por su cuenta y usar res.write para mantener la transmisión fluir.

Amit Wagner
fuente
0

reses un objeto HttpResponse que se extiende desde OutgoingMessage. res.sendllamadas res.endimplementadas por OutgoingMessage para enviar una respuesta HTTP y cerrar la conexión. Vemos código aquí

Pilón
fuente