2013-05-29 90 views
1

我想在明年的代碼運行的子進程:檢索標準輸出變量

run = function (cmd, callback) { 
    var spawn = require('child_process').spawn; 
    var command = spawn(cmd); 

    var result = ''; 

    command.stdout.on('data', function (data) { 
     result += data.toString(); 
    }); 

    command.on('exit', function() { 
     callback(result); 
    }); 
} 

execQuery = function (cmd) { 
    var result = { 
     errnum: 0, 
     error: 'No errors.', 
     body: '' 
    }; 

    run(cmd, function (message) { 
     result.body = message; 

     console.log(message); 
    }); 

    return result; 
} 

執行使用ExecQuery後( 'LS')result.body永遠是空的,但的console.log是包含價值。

回答

1

我運行了一個快速測試,並且在排除所有stdout的數據之前,命令的exit事件正在觸發。如果我將exit處理程序更改爲尋找command.stdoutend事件,我至少會獲得並打印輸出。

command.stdout.on('end', function() { 
    callback(result); 
}); 

這應該有所幫助。請注意,您可能希望爲此使用現有的庫,並且真正正確的實施將比您擁有的要多得多,但我的更改應該解決您當前的障礙問題。

隨機提示:始終爲錯誤保留回調函數的第一個參數並且您的代碼段與該約定不一致是節點約定。你可能應該調整以符合慣例。

哦,對不起,讓我來解答你關於result.body的問題。 run功能是異步!這意味着您的return result;代碼行在run回調主體之前執行,其中result.body = message;是。當涉及I/O時,不能在節點中的任何位置使用返回值。你必須使用回調。

+0

相同的情況:stdout在回調函數中由console.log接收,但是result.body在關閉之外是空的。 –