AMQP和Express,设置标头错误

时间:2018-06-05 14:33:59

标签: express amqp

我正在尝试通过“输入”队列在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})
    })
  })
});

我错过了什么? 谢谢你的帮助!

1 个答案:

答案 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})