使用EventEmitter时,无法在发送标头后设置标头

时间:2017-12-11 09:44:25

标签: node.js express events response eventemitter

这是我的代码:

const cluster = require('cluster');
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const queueMgr = require('./lib/queueManager');
const eventEmitter = new (require('events')).EventEmitter();
  const app = express();

  app.use(cors());

  app.use((req, res, next) => {
    if (channel) {
      next();
    }
    queueMgr
      .connect()
      .then(ch => {
        channel = ch;
        next();
      })
      .catch(err => {
        console.log(err);
        res
          .status(500)
          .json({ message: 'Something Went Wrong' })
          .end();
      });
  });

  app.get('/', (req, res) => {
    const taskId = Date.now() + '' + process.hrtime()[1];
    const worker = queueMgr.launchWorker();
    eventEmitter.once(taskId, msg => {
      console.log(taskId);
      res
        .status(200)
        .send({ message: msg, status: true })
        .end();
    });
    queueMgr.addTaskToQueue(channel, config.taskQueueName, taskId, 'testmsg', 1000);
  });

  app.listen(PORT, () => {
    console.log(`Process ${process.pid} listening on port ${PORT}`);
  });

在这里,对于每个GET /请求,我创建一个唯一的taskId,将其附加到`eventEmitter.once。然后我将它攻击到任务队列。

在内部,我启动一个工作人员来完成任务,然后发出taskId事件,然后在接收时,我发送taskId的响应。

现在,我的第一个请求正常。但是,我的第二个和子请求请求失败并显示错误

Error: Can't set headers after they are sent.

1 个答案:

答案 0 :(得分:1)

请注意next()函数可以被调用两次 这里

if (channel) {
  next();
}

然后在这里

.then(ch => {
   channel = ch;
   next();
})

当调用第一个调用时,可能不应该调用next()的第二个调用,如果是这样,请尝试使用return语句。

if (channel) {
  return next();
}