Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Node.js结果从繁殖进程中保持有序_Javascript_Regex_Arrays_Node.js_Asynchronous - Fatal编程技术网

Javascript 将Node.js结果从繁殖进程中保持有序

Javascript 将Node.js结果从繁殖进程中保持有序,javascript,regex,arrays,node.js,asynchronous,Javascript,Regex,Arrays,Node.js,Asynchronous,我最近一直在使用Node.js,但在寻找将子进程stdout的结果跟踪回请求的方法时遇到了问题 我有一个文件中的主机名列表,我的应用程序读取该文件,使用一个简单的正则表达式从文件中一行一行地提取主机名,使用split。然后我创建一个主机名数组。然后,对于数组中的每个主机名,我构建一个参数字符串,并使用该参数字符串生成一个进程,但是,我无法从进程内部访问计数变量“I”,也无法找到将结果跟踪回输入的方法 我的程序应该获取每个主机名并使用“子进程”调用snmp,然后它应该创建一个{hostname:“

我最近一直在使用Node.js,但在寻找将子进程stdout的结果跟踪回请求的方法时遇到了问题

我有一个文件中的主机名列表,我的应用程序读取该文件,使用一个简单的正则表达式从文件中一行一行地提取主机名,使用split。然后我创建一个主机名数组。然后,对于数组中的每个主机名,我构建一个参数字符串,并使用该参数字符串生成一个进程,但是,我无法从进程内部访问计数变量“I”,也无法找到将结果跟踪回输入的方法

我的程序应该获取每个主机名并使用“子进程”调用snmp,然后它应该创建一个{hostname:“snmp result”}数组,并在完成后将该数组保存到一个文件中

我正在使用这个程序尝试从网络设备中提取序列号。我已经重写了这段代码大约5次,我甚至用嵌套在spawn进程中的函数而不是on-data事件发射器来尝试它,但是我不知所措。相关代码如下:

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]);

}
    })
})
var spawn=require('child_process')。exec;
var split=需要(“拆分”);
var fs=需要('fs');
变量snRe=“(.*?””;
var devRe=“(junos\\-([a-z]\[0-9])+\\-([a-z]\[0-9])+$”;
var设备=[];
var输出=[];
var outfile=fs.createWriteStream('vri.txt',{'flags':'w'});
var infie=fs.createReadStream('devices',{flags:'r',encoding:'utf8'})
var spawnCmd=“/usr/local/bin/snmpwalk-v2c-c public”
变量oid=“.1.3.6.1.4.1.2636.3.1.3”
函数getSerial(回调){

for(var i=0;i由于spawn进程的异步性质,您不能使用for循环来处理这样的程序

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' ]

老实说,我从来没有想过这样做。Node实际上是我第一次深入研究异步编程。看着你的解决方案,一盏灯刚刚熄灭。这是一个这样的时刻,不仅我的问题得到了回答,而且你开始思考这将如何彻底改变我看待问题的方式。很高兴提供帮助。为了获得更多的准确信息,请omed到异步编程,您可以签出或其他类似的东西,谢谢我会签出。