Czy res.end () musi być wywoływana ekspresowo z node.js?


89

Mam kilka aplikacji Express i widzę, że w niektórych modułach res.end()jest wywoływana na końcu modułu obsługi żądań (po res.sendlub res.json), podczas gdy w innych nie jest wywoływana.

Na przykład:

app.get('/test', function(req, res) {
    res.send('Test', 200);
});

lub:

app.get('/test', function(req, res) {
    res.send('Test', 200);
    res.end();
});

Oba przypadki działają, ale boję się wycieków lub wyczerpania deskryptorów plików lub czegoś w tym rodzaju, gdy uruchamiam wiele żądań. Który z nich jest „bardziej poprawny”?


2
Myślałem, że res.send()wywołane res.end()- może być źle.
tymeJV


Dziękuję @ Trevor-Senior, szukałem tego samego pliku i nie widziałem ...
greuze

@greuze Sprawdziłem to już wcześniej, więc miałem przewagę :). Poszedłem dalej i przeniosłem komentarz do bardziej uporządkowanej odpowiedzi dla innych.
JayQuerie.com

Cześć. A co z res.status (<any>) .json (); Mam też inne pytanie. jaki kod błędu mam odesłać, jeśli odrzucam to połączenie? jak użytkownik przekroczył swój limit?
9me

Odpowiedzi:


121

Odpowiedź na twoje pytanie brzmi: nie. Nie musisz dzwonić, res.end()jeśli dzwonisz res.send(). res.send()woła res.end()do ciebie.

Zaczerpnięte z /lib/response.js , oto koniec res.send()funkcji:

  //. . .
  // respond
  this.end(head ? null : body);
  return this;
}

4
Może moje wspomnienia wreszcie się poprawiły :)
tymeJV

8

jednym z przykładów, w którym musisz wywołać funkcję end (), jest wysłanie bufora jako pliku do pobrania.

res.write(buffer);
res.end();

5

res.end([data] [, encoding])

Kończy proces odpowiedzi. Ta metoda w rzeczywistości pochodzi z rdzenia węzła , a konkretnie z response.end() method of http.ServerResponse. użycia do szybkiego zakończenia odpowiedzi bez żadnych danych.

Jeśli chcesz odpowiedzieć danymi, zamiast tego użyj metod takich jak res.send() and res.json().

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.