使用 EventEmitter 发送后无法设置 headers
Can't set headers after they are sent when using 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。然后我攻击它给一个任务queue.
在内部,我启动了一个 worker 来完成任务,然后发出 taskId
事件,在接收者上,我发送了 taskId
的响应。
现在,我的第一个请求工作正常。但是,我的第二个请求和子请求失败并出现错误
Error: Can't set headers after they are sent.
请注意 next() 函数可以被调用两次。
这里
if (channel) {
next();
}
然后在这里
.then(ch => {
channel = ch;
next();
})
也许next()的第二次调用不应该在第一次调用时进行,如果是这样,请尝试使用return语句。
if (channel) {
return next();
}
这是我的代码:
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。然后我攻击它给一个任务queue.
在内部,我启动了一个 worker 来完成任务,然后发出 taskId
事件,在接收者上,我发送了 taskId
的响应。
现在,我的第一个请求工作正常。但是,我的第二个请求和子请求失败并出现错误
Error: Can't set headers after they are sent.
请注意 next() 函数可以被调用两次。
这里
if (channel) {
next();
}
然后在这里
.then(ch => {
channel = ch;
next();
})
也许next()的第二次调用不应该在第一次调用时进行,如果是这样,请尝试使用return语句。
if (channel) {
return next();
}