如何构建一个类来抽象Node.js中的RabbitMQ和amqplib功能

nbnkbykc  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(2)|浏览(131)

我正在尝试构建一个小型库,以抽象一些使用amqplib与RabbitMQ通信所需的样板。我使用的是promise API和promise/await语法。我正在尝试构建一个类,其中包含一些方法,可用于其他几个服务器和客户端。我在网上搜索过,绝大多数的例子都是直接的,小规模的教程。
以下是到目前为止我对messages.js的理解:

const amqp = require('amqplib');

module.exports = class MQ {
    constructor(user, password, host, port) {
        this.conn;
        this.uri = 'amqp://' + user + ':' + password + '@' + host + ':' + port;
        this.channel;
        this.q = '';
    }
    async setupConnection() {
        this.conn = await amqp.connect(this.uri);
        this.channel = await this.conn.createChannel();

        await this.channel.assertQueue(this.q, { durable: false });
    }   

    send(msg) {
        this.channel.sendToQueue(this.q, Buffer.from(msg));
        console.log(' [x] Sent %s', msg);
    }

    async recv() {
        await this.channel.consume(this.q), (msg) =>{
            const result = msg.content.toString();
            console.log(`Receive ${result}`);
        };
    }
}

下面是setup.js的代码:

const MQ = require('./message');

msgq = new MQ('guest', 'guest', 'localhost', '5672')

msgq.setupConnection();

msgq.send('Test this message');

当我尝试发送消息时,我得到的错误是“TypeError:无法读取未定义的属性'sendToQueue'。”显然,通道属性未正确初始化。我把codec/awaits包含在try/catch块中,得到了同样的错误。
关于Node.js中的类/方法,我是否遗漏了什么?
我认为这与承诺的解决有关。当我将对sendToQueue()的调用向上移动到setupConnection()方法时,消息被发送。
因此,似乎我需要找到一种方法,让send方法等待setup方法的解析。

wxclj1h5

wxclj1h51#

您没有异步运行代码,因此在建立连接之前就调用了send。您需要将promise链接起来,以确保在尝试发送之前连接函数已经完成。试试这个:

const MQ = require('./message');

msgq = new MQ('guest', 'guest', 'localhost', '5672')

msgq.setupConnection()
.then(() => {
    msgq.send('Test this message');
})
pnwntuvh

pnwntuvh2#

你应该等待你的blog方法:

await msgq.setupConnection();

msgq.send('Test this message');

相关问题