Использование функции обратного вызова JS net -snmp с переменными - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь интегрировать net -snmp (https://www.npmjs.com/package/net-snmp) в nodejs. Но учитывая асинхронность природы узла. Функция обратного вызова SNMP запускается после того, как я возвращаю значения.

var answer: any;
function getVarbinds(error: any ,varbinds: any){
        console.log("===Entered get varbinds===");
        //SNMP Example code below
        if (error) {
            console.error (error);
            message = error
        } else {
            ...
           var data = "macAddress: xxx";
           answer = {code: 0, data: data, message: ""}
           console.log("Data is: " + data);
        }
}
console.log("Runing the SNMP now");
await session.get(options.oids, getVarbinds);
return await answer

Дает следующий вывод:

api_1    | Runing the SNMP now
api_1    | undefined     // <---- this is the return
api_1    | Runing the SNMP now
api_1    | Received response:
api_1    | undefined
api_1    | ===Entered get varbinds===
api_1    | Data is: {macAddress: xxx}
api_1    | ===Entered get varbinds===
api_1    | Data is: {macAddress: xxx}

1 Ответ

0 голосов
/ 03 апреля 2020

Проблема в том, что SNMP будет выполнять запрос асинхронно. Решение состоит в том, чтобы обернуть его функцией, которая заставила бы его работать синхронно.

        function parseVarbinds(varbinds: any){
            let answer: any;

            // Parse the bvarbinds returned from the SNMP session
            for (var i = 0; i < varbinds.length; i++) {
                if (snmp.isVarbindError (varbinds[i])) {
                    console.log(snmp.varbindError (varbinds[i]))
                    message = snmp.varbindError (varbinds[i])
                } else{
                     ... // Parse the varbinds here
                    }
                }
            }
            session.close ();

            return answer;
        }  

        // Wrapper for the SNMP Request        
        let wrapper = (oid: Array<String>) => {
            return new Promise(
                (resolve) => {
                session.get(oid, function ( error: any, varbinds: any ) {
                    if(error){
                        response = {code:1, message: error};
                    }
                    resolve(varbinds);
                })
        })};

        //Calling the wrapper and parsing the varbinds received from the SNMP call
        await wrapper(options.oids).then(
            data => response = parseVarbinds(data)
        ).catch(
            error => {
                console.log(error);
                response = {code: 1, message: error};
            }
        );

        return response;
...