Итак, основная идея - создать класс Wrapper, который содержит некоторые функции, чтобы упростить использование функций rabbitmq для публикации, подписки и RPC.Например, цель состоит в том, чтобы, если я захочу опубликовать что-либо, я легко воспользуюсь функцией публикации внутри класса Rabbit Wrapper, для exp это будет выглядеть примерно так: var rabbit = new IRabbitMQ();
, а затем для публикации я буду использовать функцию издателя rabbit.publisher(exchangeName, queueName, etc..)
и если мне было интересно получить, я легко позвоню rabbit.subscriber(exchangeName, queueName, etc..)
Я попробовал все идеи, которые были у меня в голове, это не сработало с вложенными классами, потому что в js я не нашелУдобный способ сделать это, я попробовал также фабричные функции или простой объект и избегать использования классов, но это не сработало.Проблема всегда заключалась в том, что когда я устанавливаю соединение и создаю канал между мной и rabbitMQ, я не могу сохранить это соединение и канал в свойстве класса Wrapper, чтобы использовать его в другой функции, если я хочу
class IRabbitMQ {
constructor() {
this.init(rabbitMQServer); // this should initialize my this.connection and this.channel property to the connection and channel object but instead receive an error because there are undefined
}
async init(host) {
try {
const connection = await amqplib.connect(host);
const channel = await connection.createChannel();
channel.prefetch(1);
console.log(' [x] Awaiting RPC requests');
this.connection = connection; // this should make a property connection with the connection object, when i console.log here it shows me the connection object but if i want to use this in another function it gaves me undefined value!
this.channel = channel;
}catch(err) {
console.error(err);
}
}
async publisher(queue, body) {
let q = await this.channel.assertQueue(queue, {durable: false});
this.channel.sendToQueue(q, Buffer.from(JSON.stringify(body)));
console.log("msg sent ", body);
}
async subsriber(queue) {
let q = await this.channel.assertQueue(queue, {durable: false});
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);
await this.channel.consume(q, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {noAck: true});
}
}
// another example using a simple object instead of a class
/* var IRabbitMQ = {
channel : undefined,
init : async (host) => {
try {
const connection = await amqplib.connect(host);
const channel = await connection.createChannel();
channel.prefetch(1);
console.log(' [x] Awaiting RPC requests');
this.channel = channel;
}catch(err) {
console.error(err);
}
},
publisher : async (queue, body) =>{
this.init(rabbitMQServer);
let q = await this.channel.assertQueue(queue, {durable: false});
this.channel.sendToQueue(q, Buffer.from(JSON.stringify(body)));
console.log("msg sent ", body);
},
subscriber : async(queue) => {
this.init(rabbitMQServer);
let q = await this.channel.assertQueue(queue, {durable: false});
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);
await this.channel.consume(q, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {noAck: true});
}
} */
Ожидаемый вывод - я могу иметь доступ к значению соединения и канала, чтобы использовать его позже в других функциях, потому что в противном случае не будет смысла создавать класс Wrapper.если у вас, ребята, есть также лучшая идея из вашего опыта создания этого, которую было бы полезно услышать.