module.exports возвращаемое значение не определено - PullRequest
0 голосов
/ 20 сентября 2018

Мало информации, у меня есть файл arp.js, который берет адрес подсети "192.168.2" и получает все строки, возвращаемые из arp -a, и сохраняет их в массиве.

Я не могу понять,почему моя функция arpList возвращает неопределенное значение в моем файле index.js.

Все console.logs возвращают правильные значения на странице arp.js при вызове из index.js, но ipObjподойдя не определено.Даже console.log до моего возвращения ipObj работает.

Любая помощь будет принята с благодарностью.

var { spawn } = require('child_process');
const arpLs = spawn('arp', ['-a']);
var bufferData;


module.exports = {
    arpList: function (subnet) {


        arpLs.stdout.on('data', data => {
            bufferData += data
        })


        arpLs.stderr.on('data', data => {
            console.log('error: ' + data);
        });


        arpLs.on('exit', function (code) {
            if (code != 0) {
                console.log("Error exiting"); //if error occurs
            }
            console.log("exit start 1"); // checking internal processes at stages
            var dataArray = bufferData.split(' ');
            var ipArray = [];
            for (i = 0; i < dataArray.length; i++) {
                if (dataArray[i].includes(subnet)) {
                    ipArray.push(dataArray[i]);
                    console.log("loop working");
                }
            }
            var ipObj = { "lanIps": ipArray };
            console.log("Object is there: "+ipObj)
            return ipObj; // this obj should be returned to the index.js call using 
        })
    },
    sayMyName: function () {
        return "Hello";
    }
}

//arpList(ipSubnet);
//INDEX.js
//the index page looks like this
//var arp = require('./arp.js);
//var ipSubnet = "192.168.2";

//var lanIps = arp.arpList(ipSubnet);
//console.log(lanIps);

В итоге я добавил функцию обратного вызова в arpList-function (подсеть, callback)

Затем, вместо возврата значения, передайте его в обратный вызов

Затем на стороне index.js вместо

var lanIps = arp.arpList(value)

я использовал

arp.arpList(value, function(res){lanIps = res}

1 Ответ

0 голосов
/ 20 сентября 2018
return ipObj; // this obj should be returned to the index.js call using 

Не возвращается. Ссылка ничего не говорит о возвращаемом значении.Обратные вызовы в стиле узла редко работают так, потому что они потенциально асинхронны, и возвращаемое значение не может быть принято во внимание.

Это особый случай этой известной проблемы .Процесс асинхронный и завершается после вызова arp.arpList(ipSubnet), присваивать lanIps нечего.Это вариант использования для обещаний.Уже есть сторонние обещанные аналоги, такие как child-process-promise.

Эту проблему также можно решить, перейдя на синхронный API.Функции child_process имеют синхронные аналоги, в том числе spawnSync.

...