Я пытаюсь создать небольшую библиотеку, чтобы абстрагировать некоторые шаблоны, необходимые с 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 ждать разрешения метода установки.