Рубрики
Без рубрики

Понимание ошибки узла [err_http_headers_sent]

Этот пост описывает, почему ошибка узла [ERR_HTTP_HEADERS_SENT] не может установить заголовки после отправки.

Автор оригинала: Prosper Opara.

Скорее всего, как разработчик Nodejs, вы столкнулись с этой ошибкой выполнения: [Err_http_headers_sent]: не удается установить заголовки после отправки клиенту

Вы должны написать идеальный код и ожидать безупречного кода, желаю), но вот эта ошибка времени выполнения разбивает ваши ожидания и определенно удерживая вас от перехода к другим проблемам вашего проекта. Теперь вы начинаете спрашивать себя, почему вы даже выбираете этот карьерный путь или даже почему вы подняли узел в первую очередь.

Спойлер предупреждает : Я столкнулся с этой ошибкой временем выполнения во время создания спокойных API, и это усилие документировать то, что я узнал об этой ошибке, сократить время отладки, поможет вам понять, почему эта ошибка брошена и, наконец, как лучше всего обрабатывать ее.

Раскрыть тайну

Ошибка [err_http_headers_sent] – это интересная ошибка, которая выпускается, когда сервер пытается отправить более одного ответа на клиента. Что это значит, что для данного клиента запрос сервера ранее отправил ответ (либо на успех от ответных данных с запросом на ресурс или ошибка для плохого запроса) обратно к клиенту, и теперь неожиданно пытаясь отправить еще один ответ

[Тематическое исследование] Обсуждение дешево

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());

app.post('/test', (req, res) => {
  if (!req.body.name) {
    res.status(400).json({
      status: 'error',
      error: 'req body cannot be empty',
    });
  }

  res.status(200).json({
    status: 'succes',
    data: req.body,
  })
});
app.listen(4000, () => {
  console.log('Server live');
});
post_request.png

Это тематическое исследование основано на простую почту запроса на /test Маршрут с использованием экспресс-каркаса.

By Design Сервер должен отправить ответ на 400 (плохой запрос) json-ответ на клиента, если у запроса нет тела (REQ .body), добавлен в запрос на сервер с клиента (обрабатывается с помощью оператора JavaScript, если Наконец, если запрос поставляется с телом A 200 (OK) JSON Resprestence тело запроса, отправляется обратно клиенту как ответ. Ожидание заключается в том, что обработчик запроса должен делать то, что мы запрограммировали это (возврат ответ на клиента). Обработчик запроса (анонимная функция, которая берет на себя req & rec Если Заявление, когда нет явной инструкции для его выхода из функции.

Глядя на логику кода, вы превышаете, что функция обработчика запроса не имеет явную команду для выхода из-за функции в ситуации, в ситуации требуемое тело не найдено, и ответ ошибки отправляется обратно клиенту, поэтому после того, как условие выписки Разрешено на сервер пытается отправить еще один ответ на клиента, и именно здесь ошибка удается.

Функция обработчика запроса уже отправила ответ на клиент с использованием метода RES.JSON (), который автоматически устанавливает заголовок ответа (каждый ответ на клиент должен содержать заголовки) для ответа (в этом случае тип контента до Приложение/JSON ). Узел поднимает это atrocity и наш сервер сбои, потому что Express под капотом пытается установить заголовок ответа для этого второго ответа, поэтому сообщение об ошибке:

Не может установить заголовки после отправки клиенту

Заголовки - Error.png.png

Исправление ошибки

Простое исправление для этой ошибки – добавить JavaScript Возвращение Заявление о возвращении ответа от IF COUNCTIOL для обеспечения того, чтобы функцию обработчика запроса выходить (расторгнуть) пробудительный код с функцией после отправки ответа клиенту.

Описание для Возвращение Заявление на MDN состояния

Когда оператор возврата используется в функциональном теле, выполнение функции остановлено. Если указано, заданное значение возвращается на функцию вызывающего абонента.

Имея в виду, наша функция обработчика запроса должна быть изменена, чтобы включить оператор возврата, например:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());

app.post('/test', (req, res) => {
  if (!req.body.name) {
    return res.status(400).json({
      status: 'error',
      error: 'req body cannot be empty',
    });
  }

  res.status(200).json({
    status: 'succes',
    data: req.body,
  })
});
app.listen(4000, () => {
  console.log('Server live');
});

Когда клиент делает запрос на сервер на эту конечную точку с помощью тела запроса на запрос сервера, сервер отправляет правильный ответ и остановить выполнение функций по мере необходимости.

post_req.png.png.

Вы бы соблазнили спросить, почему последний ответ сервера не имеет оператора возврата, отправив его на клиента?, Ну в этом случае на самом деле нет необходимости возвращать его, поскольку нет кода, который нужно понижать, так что это означает Обработчик запроса перестает возбуждать, поскольку у него есть комерия до конца дороги.

Дело в том, что оператор возврата JavaScript выходит из функции обработчика запроса (для предотвращения дополнительного выполнения кода) и отправляет А Ответ объекта обратно к клиенту.

Надеюсь, у вас есть лучшее понимание того, почему это сообщение об ошибке уволено и как это решить, и я надеюсь, документируя эту ошибку, и это исправить, я сокращаю время отладки и помогло вам понять, почему эта ошибка уволена.

У меня есть Github Repository Для неудачного кода и прохождения кода вы можете клонировать и играть с кодом, пробуя какое-либо другое использование (надеюсь, может отправить PR для вашего использования в использовании).

Спасибо за прочтение