Как создать класс для абстрагирования функциональности RabbitMQ и amqplib в Node.js - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь создать небольшую библиотеку, чтобы абстрагировать некоторые шаблоны, необходимые с amqplib для связи с RabbitMQ. Я использую обещания API и синтаксис async / await. Я пытаюсь создать класс с некоторыми методами для использования с несколькими другими серверами и клиентами. Я искал в Интернете, и подавляющее большинство примеров - это прямые, небольшие учебные пособия.

Вот что у меня есть для сообщений. 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}`);
        };
    }
}

Вот код для настройки. js:

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

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

msgq.setupConnection();

msgq.send('Test this message');

При попытке отправить сообщение появляется сообщение об ошибке «Ошибка типа: невозможно прочитать свойство« sendToQueue »из неопределенного». Видимо, свойство канала не инициализируется должным образом. Я вложил async / awaits в блоки try / catch и получил ту же ошибку.

Что-то мне не хватает в классах / методах в Node.js?

Я думаю, это как-то связано с разрешением обещаний. Когда я перемещаю вызов sendToQueue () в метод setupConnection (), сообщение отправляется.

Так что, похоже, мне нужно найти способ заставить метод send ждать разрешения метода установки.

1 Ответ

1 голос
/ 25 апреля 2020

Вы не выполняете свой код асинхронно, поэтому send вызывается до того, как соединение установлено. Вам нужно связать обещания, чтобы гарантировать, что функция соединения завершена, прежде чем пытаться отправить. Попробуйте это:

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

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

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