Каков наилучший способ или шаблон для создания класса Wrapper, чтобы абстрагироваться от использования RabbitMQ в узле JS - PullRequest
0 голосов
/ 09 апреля 2019

, поэтому я использую RabbitMQ для некоторых проектов, и я заметил, что все время буду использовать некоторый дублирующий код, поэтому я решил создать класс или интерфейс Wrapper, которые имеют некоторую функцию для непосредственного использования RabbitMQ без повторения кода всевремя.я начал делать это вчера, и у меня уже были некоторые проблемы, так как я хотел использовать ООП, и Javascript может быть сложным при использовании ООП (по крайней мере, я так думаю)

Я начал с создания класса IRAbbitMQ с функцией init дляинициализировать соединение и создать канал, я знал, что не могу использовать вложенные классы, поэтому вместо этого я хотел использовать функции Factory, я пытался сделать соединение и канал частью свойств класса IRabbitMQ, но я не знаю, почему это дало мне неопределенное значение, когдая создаю его экземпляр

class IRabbitMQ {

constructor() {

    this.init(rabbitMQServer); // rabbitMQServer for example 'localhost//5672'

}
// establish a Connection to RAbbitMQ Server
async init(host) {

    try {

    let connection = await amqplib.connect(host);

    let channel = await connection.createChannel();

    channel.prefetch(1); 

    console.log(' [x] Awaiting RPC requests');

    this.connection = connection;

    this.channel = channel;

    }

    catch(err) {

        console.error(err);
    }

}

// Close the Connection with RabbitMQ
closeConnection() {

    this.connection.close();
}

log() {
    console.log(this.connection);
}

EventPublisher() {

    function init(IRabbit, publisherName) {

        if(!IRabbit.connection) {

            throw new Error('Create an Instance of IRabbitMQ to establish a Connection');

        }

        let ch = IRabbit.channel;
        console.log(ch);
    }
    return {
        init : init
    }   
    }

   }

   var r = new IRabbitMQ();
   r.log();

когда я запускаю код, вывод не определен, я не знаю почему, так как я инициализирую свойства соединения и канала в функции init, а затем вызываю эту функцию в конструкторе такэто должно быть инициализировано, когда я создаю объект класса Wrapper.Я также хотел бы получить от вас несколько советов, лучше ли использовать классы или есть какой-либо другой лучший способ создать класс Wrapper или интерфейс для RabbitMQ, чтобы было проще использовать его и не дублировать код.

1 Ответ

0 голосов
/ 09 апреля 2019

Не совсем ответ, но я смог успешно зарегистрировать connection с этим примером кода.Я обрезал другой код, чтобы сосредоточиться на части .log(), которая регистрировала undefined.

Код далек от совершенства, но работает по крайней мере

const amqplib = require('amqplib');

class IRabbitMQ {

    constructor() { }

    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.channel = channel;
        }catch(err) {
            console.error(err);
        }
    }

    log() {
        console.log(this.connection);
    }
}

async function createInstance(){
    const instance = new IRabbitMQ();
    try {
        await instance.init('amqp://localhost');
    }catch (e) {
        throw new Error('OOPS!');
    }
    return instance;
}

async function runLogic() {
    const r = await createInstance();
    r.log();
}

runLogic().catch(console.log);

Просто прокомментируйте, еслиВы бы хотели, чтобы я дал дополнительные советы / подсказки, но, похоже, это работает для меня.

...