module.exports返回值未定义

时间:2018-09-20 00:13:51

标签: node.js module export undefined

小信息,我有一个arp.js文件,它使用子网地址“ 192.168.2”,并获取从arp -a返回的所有字符串并存储在数组中。

我不知道为什么arpList函数在index.js文件中返回未定义的值。

从index.js调用时,所有console.logs都在arp.js页面中返回正确的值,但是ipObj不确定。甚至在我返回ipObj之前的console.log都可以正常工作。

任何帮助将不胜感激。

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中添加了一个回调函数-函数(子网,回调)

然后而不是返回值,而是将其传递给回调

然后在index.js而不是

var lanIps = arp.arpList(value)

我用过

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

1 个答案:

答案 0 :(得分:1)

return ipObj; // this obj should be returned to the index.js call using 

它不会退回。 The reference不谈返回值。节点样式的回调很少那样工作,因为它们可能是异步的,并且返回值无法考虑。

这是this well-known problem的特例。该过程是异步的,并且在arp.arpList(ipSubnet)调用之后完成,没有任何东西可分配给lanIps。这是诺言的用例。已经有第三方承诺的对等方,例如child-process-promise

通过移至同步API也可以解决该问题。 child_process个功能具有同步功能,包括spawnSync