我对节点很新,我正在尝试创建一些可以获得一些服务器信息的东西.但这是我的问题.我设置一个配置对象(这将在时间上,由发生的事件动态更新),然后在函数中,我尝试访问此对象中的值. (见下面的代码)
所以首先,我设置我的vars:
var util = require('util'),child = require('child_process'),config = {};
哪个工作不错然后我加载我的配置:
function loadConfig( ) { // Add some code for auto-loading of args config = { "daemons": [ ["Apache","apache2"],["MysqL","MysqLd"],["SSH","sshd"] ] }; }
loadConfig();
之后,我运行我的检查程序.
function getDaemonStatus( ) { for(var i=0; i<config.daemons.length; i++) { child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' + config.daemons[i][1] + '\'")) print $0}\'',function( error,stdout,stderr ) { console.log(config.daemons[i]); }); } }
我得到的回应是:
undefined undefined undefined
我真的不想使用GLOBAL变量,所以你们可以想办法解决我的问题吗?
谢谢! =]
解决方法
这是一个很多人因为执行的异步排序而遇到的麻烦.
你的for循环将从0-3看起来,然后当’我’是四时退出,显然.要记住的难点在于,您的exec回调将不会立即运行.一旦进程开始运行,并且在发生的时候,for循环将被完成.
这意味着本质上,您的回调函数运行的三次,您基本上是这样做的:
console.log(config.daemons[4]);
这就是为什么它打印“未定义”.
您需要通过将循环内容包含在匿名的自动执行函数中来捕获新的范围中的“i”值.
function getDaemonStatus( ) { for(var i=0; i<config.daemons.length; i++) { (function(i) { child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' + config.daemons[i][1] + '\'")) print $0}\'',stderr ) { console.log(config.daemons[i]); }); })(i); } }
另外,我看到你的函数叫做“getDaemonStatus”.只要记住,由于该exec回调是异步的,这也意味着您不能收集每个回调的结果,然后从getDaemonStatus返回它们.相反,您将需要传递一个自己的回调,并从您的exec回调中调用它.
更新
但是请注意,每次迭代的最简单方法是使用forEach,例如.
function getDaemonStatus( ) { config.daemons.forEach(function(daemon,i){ child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' + daemon[1] + '\'")) print $0}\'',stderr ) { console.log(daemon); }); } }