Node.js Rabbitmq直接排气管,耐用

Node.js Rabbitmq直接排气管,耐用,node.js,rabbitmq,node-amqplib,Node.js,Rabbitmq,Node Amqplib,我有一个nodejs应用程序,它连接到rabbitmq服务器,向移动应用程序发送通知。 我创建了一个带有dustable:true属性的直接交换和一个带有persistent:true属性的发布消息,但消息并没有被存储。例如,如果我发布了具有routeKey“hello”的消息,并且在发布该消息时,不存在任何绑定为“hello”的队列,则exchange会忽略此消息。我想存储此消息,并在“hello”绑定建立时发送到队列。我怎样才能达到这个目标? 下面是我的代码。任何帮助,我都感激 const

我有一个nodejs应用程序,它连接到rabbitmq服务器,向移动应用程序发送通知。 我创建了一个带有dustable:true属性的直接交换和一个带有persistent:true属性的发布消息,但消息并没有被存储。例如,如果我发布了具有routeKey“hello”的消息,并且在发布该消息时,不存在任何绑定为“hello”的队列,则exchange会忽略此消息。我想存储此消息,并在“hello”绑定建立时发送到队列。我怎样才能达到这个目标? 下面是我的代码。任何帮助,我都感激

const { clients } = require("./ws");
const { env } = require("../config/env");
const amqp = require("amqplib/callback_api");
const rabbitmq = {};
const exchange = "NOTIFICATION3";

amqp.connect(env.rabbitmqUrl, (err, conn) => {
  if (err) {
    console.log(`amqp.connect Error ${err}`);
    return;
  }
  conn.createChannel((err, ch) => {
    if (err) {
      console.log(`conn.createChannel Error ${err}`);
      return;
    }
    ch.assertExchange(exchange, "direct", { durable: true });
    ch.assertQueue("", { exclusive: true }, (err, q) => {
      if (err) {
        console.log(`ch.assertQueue Error ${err}`);
        return;
      }
      ch.prefetch(1);
      ch.consume(
        q.queue,
        (msg) => {
          console.log(
            ` [x] ${msg.fields.routingKey}: ${msg.content.toString()}`
          );
          ch.ack(msg);
        },
        { noAck: false }
      );

      rabbitmq.bind = ((ch, q, exchange) => (userId) => {
        ch.bindQueue(q.queue, exchange, userId);
      })(ch, q, exchange);

      rabbitmq.unbind = ((ch, q, exchange) => (userId) => {
        ch.unbindQueue(q.queue, exchange, userId);
      })(ch, q, exchange);
      rabbitmq.bind("1");
      rabbitmq.bind("2");
      setTimeout(() => {
        rabbitmq.bind("3");
      }, 2000);
    });
    rabbitmq.publish = ((ch, exchange) => (userId, msg) => {
      ch.publish(exchange, userId, Buffer.from(msg), {
        persistent: true,
      });
      console.log(` [x] Sent ${msg} to ${exchange}: ${userId}`);
    })(ch, exchange);
    setTimeout(() => {
      rabbitmq.publish("1", "tarik carli");
      rabbitmq.publish("2", "tarik carli");
      rabbitmq.publish("3", "tarik carli");
    }, 1000);
  });
});
module.exports = rabbitmq;
下面是我的console.log结果

Server is listening port 4000. [x] Sent tarik carli to NOTIFICATION3: 1 [x] Sent tarik carli to NOTIFICATION3: 2 [x] Sent tarik carli to NOTIFICATION3: 3 [x] 1: tarik carli [x] 2: tarik carli 服务器正在侦听端口4000。 [x] 送塔里克·卡利去通知3:1 [x] 送塔里克·卡利去通知3:2 [x] 送塔里克·卡利去通知3:3 [x] 1:塔里克·卡利 [x] 2:塔里克·卡利