如何在 Node js 中跨文件或控制器共享一个基于 promise 的 RabbitMQ 连接,而不是每次都创建一个新的连接?

How to share a single promise based RabbitMQ connection across files or controllers in Node js instead of creating a new Connection each time?

amqplib 库允许您创建一个 rabbitmq 连接,该对象将成为执行其他操作(例如创建频道等)的转折点。

假设我要使用 Producer/Consumer 模式,每次用户点击特定路线时,都会生成一个作业并发送到 rabbitmq 服务器,由某些消费者(工人)处理。

app.post("/routethatdelegatesheavywork", async (req,res) => { 
  const amqpServerLink =
        "link-to-cloudmq";
      const connection = await amqp.connect(amqpServerLink);
      const channel = await connection.createChannel();
      //do other stuff with channel
})

虽然这“有效”,但我不想在每次调用控制器时都重新创建该连接,因为它会使生产者变得非常慢,而且它确实不是应该如何完成的。

这是我的问题所在:

如何初始化一个连接并在每次需要时重新使用它?

我曾尝试在控制器外部创建一个连接并在必要时使用它,但这是不可能的,因为该连接是基于承诺的,并且 await 在入口点上不起作用,它必须在 async 功能正常工作。

尽管可以使用 ESM(es 模块)运行 不异步等待,但我不想这样做,因为我已经使用 CommonJS 编写了所有应用程序(require("package")),更改它需要我查看大量文件并根据 ESM 更改每个 import/export。

那么,有没有其他方法可以创建一个连接(基于承诺)并重新使用它而无需迁移到 ESM 语法?

是的,记住 nodejs 中的 require 是单例。制作一个新的 amqpServerInterface 模块,然后做

const amqpServerLink = "link-to-cloudmq"
const connection = amqp.connect(amqpServerLink)

function connect() {
      return connection
}

module.exports = {
     connect
}

然后在你的控制器中

const amqpServerInterface = require('amqpServerInterface')

app.post("/routethatdelegatesheavywork", async (req,res) => { 
 
      const connection = await amqpServerInterface.connect();
      const channel = await connection.createChannel();
      //do other stuff with channel
})

这将始终return相同的连接承诺并将解析为保存连接。