我正在尝试通过“输入”队列在POST请求上发送消息,并且一旦消息被处理并通过“results”队列发回,则使用res.json()进行响应。
这是第一次使用,但在第二次POST请求后,在收到结果后,会抛出错误:
Error: Can't set headers after they are sent.
代码如下所示:
const connection = cb => {
amqp.connect(amqp_uri, (err, conn) => {
if (err) {
throw new Error(err)
}
cb(conn)
})
}
router.post('/', (req, res) => {
const input = JSON.stringify(req.body);
const queueToSend = "input";
const queueToReceive = "results";
connection(conn => {
let results = null;
conn.createChannel((err, ch) => {
if (err) {
throw new Error(err)
}
ch.assertQueue('input', {durable: false});
ch.assertQueue('results', {durable: false})
ch.sendToQueue('input', new Buffer(input));
ch.consume('results', (msg) => {
ch.ack(msg)
results = JSON.parse(msg.content);
console.log('received results');
res.json(results);
}, {noAck: false})
})
})
});
我错过了什么? 谢谢你的帮助!
答案 0 :(得分:0)
我认为错误是由于收到结果后没有关闭频道。
现在可以使用:
ch.consume('results', (msg) => {
ch.ack(msg)
results = JSON.parse(msg.content);
console.log('received results');
res.json(results);
ch.close(function() {conn.close()}) // <---
}, {noAck: false})