2013-03-20 19 views
14

我試圖以字符串的形式返回此函數的輸出,但它以undefined的形式返回。我哪裏錯了?Node.js:寫一個函數返回spawn標準輸出爲字符串

function run(cmd){ 
    var spawn = require('child_process').spawn; 
    var command = spawn(cmd); 
    var result = ''; 
    command.stdout.on('data', function(data) { 
      result += data.toString(); 
    }); 
    command.on('close', function(code) { 
      return result; 
    }); 
} 
console.log(run('ls')); 

回答

25

您的函數在command.on語句後立即返回。您回撥close事件中的return聲明無法返回。 return屬於事件回調,而不屬於run()

console.log撥打而不是return result

一般來說,你應該寫這樣的:

function run(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('close', function(code) { 
     return callback(result); 
    }); 
} 

run("ls", function(result) { console.log(result) }); 
+0

謝謝!我將如何改變它的功能輸出到一個變量,而不是console.log? – 2013-03-20 05:18:28

+1

你應該做任何你必須做的與命令結果回調函數,只是用實際代碼替換console.log。一切都是異步的,所以即使你試圖把結果值放在一個全局變量中,你也不能分辨它什麼時候可用。如果你真的想以非異步的方式做一些事情,這可以幫助:https://github.com/caolan/async#series。但問問自己爲什麼你想這樣做。 – fuwaneko 2013-03-21 13:52:59

+0

Waaaah我很傻。正在解決我對'child.stdout.on('data',data)'的承諾,並想知道爲什麼我的輸出不完整並被隨機截斷。如果遇到這個問題,請將數據存儲到首先在您的'child.on('close')'事件中解析/拒絕的變量中,如同在此答案中一樣。謝謝@fuwaneko – GrayedFox 2018-03-05 05:24:38

4
var spawn = require('child_process').spawn, 
    command = spawn('ls', ['/tmp/']); 
command.stdout.pipe(process.stdout); 

以下link正是因爲你同樣的問題。

+0

聰明的,但他可能想要做MOER然後只需打印出結果來process.stdout – mkoryak 2013-03-20 05:15:19

+1

感謝您的回答。我將如何將stdout.pipe存儲到變量中? – 2013-03-20 05:20:05

+0

看看https://gist.github.com/pguillory/729616是你想要的。 – Marcel 2014-03-31 12:13:03

相關問題