Qual é a diferença entre res.end () e res.send ()?


141

Sou iniciante Express.jse estou confuso com essas duas palavras-chave: res.end()e res.send().

Eles são iguais ou diferentes?


1
Eu acho res.endusado por nó simples onde, como res.sendé usado por framwork expressa
Muhammad Umer Idreesi

Respostas:


129

res.send()enviará a resposta HTTP. Sua sintaxe é,

res.send([body])

O parâmetro body pode ser um objeto Buffer, uma String, um objeto ou uma Matriz. Por exemplo:

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' });

Veja isso para mais informações.

res.end()finalizará o processo de resposta. Na verdade, esse método vem do núcleo do nó, especificamente do response.end()método de http.ServerResponse. É usado para finalizar rapidamente a resposta sem nenhum dado. Por exemplo:

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

Leia isto para mais informações.


68
Mas res.end pode realmente agir como res.send, pois você pode passar um argumento de string para adicionar como o corpo da resposta. Além disso, res.send também encerra a resposta. Então, como eles são funcionalmente diferentes?
saltthehash

31
@ psytech140 O Jmar77 teve uma boa resposta aqui : "Se você passar uma string para res.send (), ela automaticamente assume um tipo de conteúdo de html. res.end (), no entanto, simplesmente chama a implementação end () subjacente do nó no diretório fluxo de resposta, portanto, nenhuma suposição é feita para o Tipo de conteúdo ".
precisa saber é o seguinte

Tive que votar isso puramente porque eu nunca usei, expressmas pelo título pensei - alguém envia algo, termina algo ... 'está certo.
Darren Bartrup-Cook

Mas e se você apenas usar res.send()com nada. Isso funciona assim res.end()?
CMCDragonkai


108

Eu gostaria de enfatizar um pouco mais algumas diferenças importantes entre res.end()e res.send()com relação aos cabeçalhos de resposta e por que eles são importantes.

1. res.send () verificará a estrutura da sua saída e definirá as informações do cabeçalho de acordo.


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

insira a descrição da imagem aqui


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

insira a descrição da imagem aqui

Onde com res.end () você pode responder apenas com texto e ele não define " Tipo de conteúdo "

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

insira a descrição da imagem aqui

2. res.send () definirá o atributo "ETag" no cabeçalho da resposta

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

insira a descrição da imagem aqui

¿Por que essa tag é importante?
O cabeçalho de resposta HTTP ETag é um identificador para uma versão específica de um recurso. Ele permite que os caches sejam mais eficientes e economiza largura de banda, pois um servidor da web não precisa enviar uma resposta completa se o conteúdo não foi alterado.

res.end() NÃO definirá este atributo de cabeçalho


4
Esta resposta deve ser aceita na minha opinião ... mais ênfase é feita nas diferenças reais que podem arruinar o seu dia de trabalho, em vez de discutir como encerrar a resposta com / sem conteúdo ...
Tomas

13

o que res.send () faz é implementar res.write , res.setHeaders e res.end .
verifica quais são os dados que você envia e define os cabeçalhos corretos,

em seguida, transmite os dados com res.write e, no final, usa res.end para definir o final da solicitação.

Em alguns casos, você desejará fazê-lo manualmente, por exemplo, se quiser transmitir um arquivo ou um conjunto de dados grande; nesses casos, você desejará definir os cabeçalhos por conta própria e usar o res.write para manter o fluxo fluxo.


0

resé um objeto HttpResponse que se estende de OutgoingMessage. res.sendchamadas res.endimplementadas pelo OutgoingMessage para enviar resposta HTTP e fechar conexão. Vemos código aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.