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

问题描述 投票:0回答:1

我正试图构建一个小库,以抽象出与RabbitMQ通信所需的amqplib的一些模板。我使用的是 promises api 和 asyncawait 语法。我正试图构建一个包含一些方法的类,以便与其他几个服务器和客户端一起使用。我在网上搜索了一下,绝大多数的例子都是直接的小规模教程。

这是我目前所拥有的message.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: Cannot read property 'sendToQueue' of undefined."。显然,通道属性没有被正确初始化。我把asyncawaits用trycatch块括起来,得到的是同样的错误。

Node.js中的classesmethods是否有我遗漏的地方?

我认为这与承诺的解析有关。当我把sendToQueue()的调用移到setupConnection()方法上,消息就会被发送。

因此,我似乎需要找到一种方法,让发送方法等待setup方法的解析。

node.js rabbitmq node-amqplib
1个回答
1
投票

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

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

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

msgq.setupConnection()
.then(() => {
    msgq.send('Test this message');
})
© www.soinside.com 2019 - 2024. All rights reserved.