Должен ли вызываться res.end () в экспресс-режиме с помощью node.js?


89

У меня есть несколько приложений Express , и я вижу, что в некоторых модулях он res.end()вызывается в конце обработчика запроса (после res.sendили res.json), а в других он не вызывается.

Например:

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

или:

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

Оба случая работают, но я боюсь утечек или исчерпания файловых дескрипторов или чего-то подобного, когда я выполняю много запросов. Какой из них «правильнее»?


2
Я думал, что res.send()сработало res.end()- но все же могло ошибаться.
tymeJV 03


Спасибо @ Trevor-Senior, я просматривал тот самый файл и не видел его ...
greuze

@greuze Я уже искал это раньше, так что у меня было преимущество :). Я пошел дальше и переместил комментарий в более структурированный ответ для других.
JayQuerie.com 03

Здравствуй. А что насчет res.status (<any>) .json (); И еще у меня вопрос. какой код ошибки я должен отправить обратно, если я отклоняю этот вызов? как пользователь превысил свой лимит?
9me

Ответы:


121

Ответ на ваш вопрос - нет. Вам не нужно звонить, res.end()если вы звоните res.send(). res.send()зовет res.end()вас.

Взято из /lib/response.js , вот конец res.send()функции:

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

4
Может, мои воспоминания наконец-то улучшаются :)
tymeJV 03

8

один из примеров, когда вы должны вызвать функцию end (), - это когда вы отправляете буфер в виде файла для загрузки.

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

5

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

Завершает процесс ответа. Этот метод фактически исходит из ядра Node , в частности, response.end() method of http.ServerResponse. для быстрого завершения ответа без каких-либо данных.

Если вам нужно ответить данными, вместо этого используйте такие методы, как res.send() and res.json().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.