Jaka jest różnica między res.end () i res.send ()?


141

Jestem początkującym Express.jsi jestem zdezorientowany przez te dwa słowa kluczowe: res.end()ires.send() .

Czy są takie same czy różne?


1
Myślę, że res.endużywany przez zwykły węzeł, gdzie res.sendjest używany przez ekspresowe framwork
Muhammad Umer Idreesi

Odpowiedzi:


130

res.send()wyśle ​​odpowiedź HTTP. Jego składnia to:

res.send([body])

Parametr body może być obiektem Buffer, String, obiektem lub Array. Na przykład:

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

Zobacz to, aby uzyskać więcej informacji.

res.end()zakończy proces odpowiedzi. Ta metoda w rzeczywistości pochodzi z rdzenia Node, a konkretnie z response.end()metody http.ServerResponse. Służy do szybkiego zakończenia odpowiedzi bez żadnych danych. Na przykład:

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

Przeczytaj to, aby uzyskać więcej informacji.


68
Ale res.end może faktycznie działać jak res.send, w tym sensie, że możesz przekazać argument w postaci łańcucha, który zostanie dodany jako treść odpowiedzi. Ponadto res.send również kończy odpowiedź. Czym więc różnią się funkcjonalnie?
saltthehash

31
@ psytech140 Jmar77 miał ładny odpowiedź tutaj : „Jeśli przekazać ciąg res.send (), to automatycznie zakłada Content-Type HTML res.end (), jednak po prostu wywołuje bazowy koniec węzła () realizacja sprawie. strumień odpowiedzi, więc nie są przyjmowane żadne założenia dotyczące typu zawartości. "
abagh0703

Musiałem to głosować wyłącznie dlatego, że nigdy nie użyłem, expressale z tytułu myśli - ktoś coś wysyła, coś kończy ... To było dobrze.
Darren Bartrup-Cook

Ale co, jeśli po prostu używasz res.send()niczego. Czy to działa res.end()?
CMCDragonkai


108

Chciałbym położyć większy nacisk na kilka kluczowych różnic między nagłówkami odpowiedzi res.end()i res.send()w odniesieniu do nich oraz dlaczego są one ważne.

1. res.send () sprawdzi strukturę twojego wyjścia i odpowiednio ustawi informacje w nagłówku.


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

wprowadź opis obrazu tutaj


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

wprowadź opis obrazu tutaj

Gdzie za pomocą res.end () możesz odpowiedzieć tylko tekstem i nie ustawi to " Content-Type "

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

wprowadź opis obrazu tutaj

2. res.send () ustawi atrybut „ETag” w nagłówku odpowiedzi

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

wprowadź opis obrazu tutaj

¿Dlaczego ten tag jest ważny?
Nagłówek odpowiedzi HTTP ETag jest identyfikatorem określonej wersji zasobu. Pozwala na bardziej wydajne buforowanie i oszczędza przepustowość, ponieważ serwer WWW nie musi wysyłać pełnej odpowiedzi, jeśli zawartość nie uległa zmianie.

res.end() NIE ustawi tego atrybutu nagłówka


4
Moim zdaniem taka odpowiedź powinna zostać zaakceptowana ... więcej amfazy opiera się na faktycznych różnicach, które mogą zrujnować dzień pracy, zamiast dyskusji na temat zakończenia odpowiedzi z treścią / bez ...
Tomas

13

co robi res.send (), to zaimplementowanie res.write , res.setHeaders i res.end .
sprawdza jakie dane wysyłasz i ustawia prawidłowe nagłówki,

następnie przesyła strumieniowo dane za pomocą res.write, a na końcu używa res.end do ustawienia końca żądania.

są przypadki, w których będziesz chciał to zrobić ręcznie, na przykład jeśli chcesz przesłać plik strumieniowy lub duży zestaw danych, w takich przypadkach będziesz chciał ustawić nagłówki samodzielnie i użyć res.write, aby zachować strumień pływ.


0

resjest obiektem HttpResponse, który dziedziczy z OutgoingMessage. res.sendwywołania, res.endktóre są realizowane przez OutgoingMessage w celu wysłania odpowiedzi HTTP i zamknięcia połączenia. Widzimy tutaj kod

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.