保持产生进程的Node.js结果

最近我一直在使用Node.js,并且遇到问题,find一种方法来跟踪返回到请求的subprocessstdout的结果。

我有一个文件中的主机名列表,我的应用程序读取文件,使用一个简单的正则expression式从文件中一次一行地拉动主机名,使用拆分。 然后我创build一个主机名数组。 然后,对于数组中的每个主机名我build立一个参数string,并使用该参数string产生一个进程,但是,我没有办法从进程内访问计数variables“我”,我无法find一种方式来跟踪结果返回到input。

我的程序应该采取每个主机名称,并使用“subprocess”调用snmp,然后它应该创build和arrays{主机名:“snmp-result”},最后一次完成后,将数组保存到文件。

我正在使用此程序尝试从networking设备中提取序列号。 我已经重写了这个代码大约5次,我甚至用一个函数嵌套在spawn过程中,而不是一个on数据事件发射器,但是我很茫然。 相关代码如下:

var spawn = require('child_process').exec; var split = require('split'); var fs = require('fs'); var snRe = '"(.*?)"'; var devRe = "(junos\\-([az]|[0-9])+\\-([az]|[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]); } }) }) 

由于产卵过程的asynchronous性质,您不能使用for循环来处理这样的程序。 recursion是你的朋友在这里。

 var spawn = require('child_process').exec; var max = 3; function genSerial(bufs, callback) { if(bufs.length === max) { callback(null, bufs); return; } var ps = spawn('sleep 1; date'); ps.stdout.on('data',function(buf) { console.log(buf); bufs.push(buf); genSerial(bufs, callback); }); } genSerial([], function(err, bufs) { console.log('showing buffers', bufs); }); 

和输出是

 benny@benny-VirtualBox:~/Documents/so$ node test.js Fri Jan 17 06:54:58 NZDT 2014 Fri Jan 17 06:54:59 NZDT 2014 Fri Jan 17 06:55:00 NZDT 2014 showing buffers [ 'Fri Jan 17 06:54:58 NZDT 2014\n', 'Fri Jan 17 06:54:59 NZDT 2014\n', 'Fri Jan 17 06:55:00 NZDT 2014\n' ]