Невозможно установить заголовки после того, как они будут отправлены на клиентскую ошибку при потоковой передаче ответа с помощью res.write

Я пытаюсь передать ответ от экспресса, используя метод res.write. Ниже мой код, я получаю сообщение об ошибке «Невозможно установить заголовки после их отправки клиенту», когда я попадаю на сервер. Я пытаюсь передать каждую запись массива. Может кто-нибудь помочь?

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  const arr = new Array(1, 2, 3, 4, 5);
  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });

  for(const num of arr) {
    res.write(num);
  }

  res.end('Done!!')
});

module.exports = router;

person yondu_udanta    schedule 29.07.2019    source источник
comment
Кажется маловероятным, что этот код сам по себе демонстрирует ошибку, о которой вы сообщаете. Я думаю, что должен быть какой-то другой код, связанный с созданием этой конкретной ошибки.   -  person jfriend00    schedule 30.07.2019
comment
Я отмечаю, что res.write() ожидает строку или буфер, а не число, но это, вероятно, не то, что вызывает ошибку, о которой вы спрашивали.   -  person jfriend00    schedule 30.07.2019
comment
Мой Бог!! После преобразования int в String он работает!!   -  person yondu_udanta    schedule 30.07.2019


Ответы (1)


Согласно документу, res.write() ожидает строку или буфер, а не число.

И, похоже, это место в http.write() коде< /a>, где выдается исключение, если это не строка или буфер.

  if (!fromEnd && typeof chunk !== 'string' && !(chunk instanceof Buffer)) {
    throw new ERR_INVALID_ARG_TYPE('first argument',
                                   ['string', 'Buffer'], chunk);
  }

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

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


При более подробном рассмотрении кода Express кажется, что вокруг обработчика запросов есть try/catch здесь:

Layer.prototype.handle_request = function handle(req, res, next) {
  var fn = this.handle;

  if (fn.length > 3) {
    // not a standard request handler
    return next();
  }

  try {
    fn(req, res, next);
  } catch (err) {
    next(err);
  }
};

Это попытается превратить вышеуказанное исключение в ответ об ошибке, но если заголовки уже были очищены, что, вероятно, было бы, когда вы вызвали res.write(), то это вызвало бы ошибку, которую вы испытали об уже отправленных заголовках.

person jfriend00    schedule 29.07.2019
comment
@latish - я добавил больше к своему ответу и думаю, что могу объяснить, почему это вызвало ошибку, которую вы видели. - person jfriend00; 30.07.2019
comment
идеально!! именно это и происходит. Я закомментировал код в обработчике ошибок, который устанавливает код ответа на 500, и ошибка исчезла. Большое спасибо, приятель! - person yondu_udanta; 30.07.2019