2
我最近一直在使用Node.js,并且遇到问题,找到一种方法来跟踪返回请求的子进程stdout的结果。保持产生进程的Node.js结果的顺序
我有一个文件中的主机名列表,我的应用程序读取文件,使用一个简单的正则表达式一次从文件中拉出主机名一行,使用拆分。然后我创建一个主机名数组。然后,为数组中的每个主机名创建一个参数字符串,并使用该参数字符串产生一个进程,但是,我无法从进程内部访问计数变量“i”,并且我无法找到跟踪结果返回到输入。
我的程序应该采用每个主机名称并使用“子进程”调用snmp,然后它应该创建和{hostname:“snmp-result”}的数组,并且最后一次完成后,将该数组保存到文件中。
我正在使用此程序尝试从网络设备中提取序列号。我已经重写了这段代码大约5次,我甚至用嵌套在spawn过程中的函数尝试了它,而不是在数据事件发射器上,但是我很茫然。相关代码如下:
var spawn = require('child_process').exec;
var split = require('split');
var fs = require('fs');
var snRe = '"(.*?)"';
var devRe = "(junos\\-([a-z]|[0-9])+\\-([a-z]|[0-9])+$)";
var devices = [];
var output = [];
var outfile = fs.createWriteStream('vri.txt',{'flags':'w'});
var infile = fs.createReadStream('devices',{flags: 'r', encoding: 'utf8'})
var spawnCmd = "/usr/local/bin/snmpwalk -v2c -c public"
var oid = ".1.3.6.1.4.1.2636.3.1.3"
function getSerial(callback) {
for (var i=0;i<devices.length;i++) {
var argument = spawnCmd + " " + devices[i] + " " + oid;
ps = spawn(argument);
ps.stdout.on('data',function(buf) {
if (buf) {
output.push(devices[i] + ": " + (buf.match(snRe))[1] +"\n");
}
else {
output.push('could not be reached');
}
})
//console.log(i + devices[i] + ": " + output[i] + '\n');
}
}
callback();
}
getDevices(function() {
getSerial(function() {
for (var i=0;i<output.length;i++) {
outfile.write(output[i]);
}
})
})
它老老实实从来没有想过我做这种方式。节点是我第一次深入研究异步编程。看着你的解决方案,一盏灯刚刚熄灭。这是不仅我的问题得到回答的那些时刻之一,而且你开始考虑这将如何彻底改变我看待问题的方式。 – bufo333
非常感谢作品 – bufo333
很高兴帮助。要更习惯于异步编程,可以查看http://www.slideshare.net/cacois/nodejs-patterns-for-discerning-developers或其他类似的东西 – leorex