我如何构建一个 class 来抽象 Node.js 中的 RabbitMQ 和 amqplib 功能
How can I build a class to abstract RabbitMQ and amqplib functionality in Node.js
我正在尝试构建一个小型库来提取 amqplib 与 RabbitMQ 通信所需的一些样板。我正在使用 promises api 和 async/await 语法。我正在尝试使用一些方法构建一个 class 以与其他几个服务器和客户端一起使用。我在网上搜索过,绝大多数例子都是直接的、小规模的教程。
这是我目前为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: Cannot read property 'sendToQueue' of undefined." 显然频道 属性 没有正确初始化。我将 async/await 包含在 try/catch 块中并得到相同的错误。
Node.js 中的 classes/methods 有什么我遗漏的吗?
我觉得这跟诺言的兑现有关系。当我将对 sendToQueue() 的调用移动到 setupConnection() 方法时,消息被发送。
所以看来我需要找到一种方法让发送方法等待设置方法的解析。
您不是 运行 您的异步代码,因此在建立连接之前调用发送。您需要链接承诺以确保在尝试发送之前连接功能已完成。试试这个:
const MQ = require('./message');
msgq = new MQ('guest', 'guest', 'localhost', '5672')
msgq.setupConnection()
.then(() => {
msgq.send('Test this message');
})
我正在尝试构建一个小型库来提取 amqplib 与 RabbitMQ 通信所需的一些样板。我正在使用 promises api 和 async/await 语法。我正在尝试使用一些方法构建一个 class 以与其他几个服务器和客户端一起使用。我在网上搜索过,绝大多数例子都是直接的、小规模的教程。
这是我目前为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: Cannot read property 'sendToQueue' of undefined." 显然频道 属性 没有正确初始化。我将 async/await 包含在 try/catch 块中并得到相同的错误。
Node.js 中的 classes/methods 有什么我遗漏的吗?
我觉得这跟诺言的兑现有关系。当我将对 sendToQueue() 的调用移动到 setupConnection() 方法时,消息被发送。
所以看来我需要找到一种方法让发送方法等待设置方法的解析。
您不是 运行 您的异步代码,因此在建立连接之前调用发送。您需要链接承诺以确保在尝试发送之前连接功能已完成。试试这个:
const MQ = require('./message');
msgq = new MQ('guest', 'guest', 'localhost', '5672')
msgq.setupConnection()
.then(() => {
msgq.send('Test this message');
})