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.