Разница между response.status и response.writeHead? - PullRequest
5 голосов
/ 28 октября 2019

В чем разница между следующим

response.status(200).send('Hello World!');

и этим

response.writeHead(200, {'content-type':'application/json'}); 
response.end('Hello World!');

Что из этого следует использовать, когда?

Ответы [ 3 ]

6 голосов
/ 28 октября 2019

response.status(...) назначает код состояния, который будет использоваться в будущем. Заголовки не отправляются до тех пор, пока тело ответа не будет отправлено.

response.writeHead(...) фактически ставит в очередь заголовки ответа для немедленной отправки. Это означает, что вы больше не можете назначать какие-либо заголовки или коды состояния для этого ответа впоследствии, поскольку все они уже были отправлены.

Как правило, вы будете использовать предыдущий шаблон, но .writeHead полезно, если выхочу, чтобы время до первого байта (TTFB) происходило раньше.

4 голосов
/ 28 октября 2019

С точки зрения statusCode все они идентичны:

  1. Вызов res.status(statusCode)
  2. Настройка res.statusCode свойство напрямую
  3. Передача statusCode на res.writeHead(statusCode, ...)
  4. Вызов res.sendStatus(statusCode)

Для самого statusCode они все делают одно и то же, что устанавливает свойство .statusCode. Это значение свойства затем используется всякий раз, когда ответ отправляет заголовки (что может быть сразу или позже, в зависимости от того, какой вариант вы выбрали). В этом можно убедиться, посмотрев исходный код Express и http (см. Ссылки ниже).

Вызов res.status() и установка res.statusCode, просто установите свойство для дальнейшего использования.

Вызов res.writeHead() устанавливает свойство res.statusCode и затем приводит к немедленной очистке заголовков, а не к их обычному поведению, помещенному в очередь для последующей отправки. Но с точки зрения statusCode нет никакой разницы.

Вызов res.sendStatus() устанавливает свойство res.statusCode, после чего ответ будет немедленно отправлен только с заголовками, без тела. Это часто используется для ответов, которые не нуждаются в теле (перенаправления, коды ошибок и т. Д.).


Для подобных вопросов вы можете просто посмотреть исходный код. Для .status() мы видим this :

res.status = function status(code) {
  this.statusCode = code;
  return this;
};

Затем в коде nodejs для http.ServerResponse вы можете видеть, что вызов .writeHead()Вы сами устанавливаете то же свойство this.statusCode перед вызовом .end(), чтобы очистить заголовки и остальную часть ответа:

И, если вы посмотрите на документ для http.ServerResponse,Вы видите это:

response.statusCode

Добавлено в: v0.4.0

По умолчанию: 200

При использовании неявных заголовков (без вызоваresponse.writeHead () явно), это свойство контролирует код состояния, который будет отправлен клиенту при очистке заголовков.

Итак, .status() - это просто метод установки statusCode свойство, к которому будет отправлено значение ответа, когда заголовки будут в конечном итоге отправлены (в будущем) и (с точки зрения statusCode) точно так же, как вызов writeHead() и передача ему статуса.

Экспресс пытается играть на немного более высоком уровне абстракции, поэтомуони создали метод для установки statusCode отдельно, который может быть вызван в любое время до установки ответа.

1 голос
/ 28 октября 2019

В дополнение к ответу Джейкоба, response.status не является частью стандартной библиотеки NodeJS (см. документы ), но фактически является сторонним

...