Что регистрировать для устранения ошибки [ERR_HTTP_HEADERS_SENT]? - PullRequest
0 голосов
/ 02 ноября 2019

В функции контроллера Express я сталкиваюсь с этой ошибкой Error [ERR_HTTP_HEADERS_SENT]. Это происходит, когда я вызываю res.json(), если заголовки уже установлены для объекта res. Тем не менее, я не вижу места в моей функции (или промежуточном программном обеспечении), где заголовки могли бы быть установлены до моего вызова res.json().

. До вызова res.json я мог проверить, были ли установлены заголовки и, если это так, записать некоторую информацию о том, кто их установил.

async function get(req, res) {

  ... 

  if (res._header) {
    logger.debug(...);
  }

  res.json(...);

К сожалению, я не вижу ничего полезного в объекте res для регистрации, в любом сообщении, которое указывало бы, почему / как были установлены заголовки (или кто их установил). Какие-нибудь предложения для того, что я мог войти, чтобы отладить эту проблему? Или другие предложения по отладке?

1 Ответ

2 голосов
/ 05 ноября 2019

Вы можете установить res.header res.send res.set, чтобы записать трассировку стека. Например, это мое основное приложение.

const express = require('express');
const app = express();

const someGoody = require('./stupid-blackbox');

/** patch the res **/
app.use((req, res, next) => {
  const _header = res.header.bind(res); // .header and .set is an alias pair
  const _send = res.send.bind(res);

  res.header = res.set = (field, val) => {
    console.trace('.header/.set called', field, val);
    console.log('-----');
    return _header(field, val);
  }

  res.send = (body) => {
    console.trace('.send called', body);
    console.log('-----');
    return _send(body);
  }

  next();
})

// some innocent looking middleware
app.use(someGoody);

// my main routes
app.get('*', (req, res) => {
  res.json({url: req.url});
})

app.listen(3000);

А для stupid-blackbox.js:

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

router.use((req, res, next) => {
  res.header('X-Crash-You', '1').send(':)');
  next();
})

module.exports = router;

При запуске вы получите это в журнале:

Trace: .header/.set called X-Crash-You 1
    at ServerResponse.res.header.res.set (C:\Users\eric_\Desktop\initial\play\index.js:11:13)
    at router.use (C:\Users\eric_\Desktop\initial\play\stupid-blackbox.js:6:9)
    at Layer.handle [as handle_request] (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:174:3)
    at router (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\layer.js:95:5)
-----
Trace: .send called :)
    at ServerResponse.res.send (C:\Users\eric_\Desktop\initial\play\index.js:17:13)
    at router.use (C:\Users\eric_\Desktop\initial\play\stupid-blackbox.js:6:36)
    at Layer.handle [as handle_request] (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:174:3)
    at router (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (C:\Users\eric_\Desktop\initial\play\node_modules\express\lib\router\layer.js:95:5)

Во второй строке каждой трассировки стека вы можете увидеть stupid-blackbox.js.

В примечании стороны res.json не приведет к ошибке, если вызывается только res.header или res.setошибка в том, что заголовки были отправлены , что означает, что где-то в коде вызывается res.send, в результате чего заголовки отправляются перед вашим фактическим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...