2017-07-08 49 views
0

我使用这个代码:在Windows上产生child_process的NodeJs脚本,为什么我需要'shell:true'来处理ENOENT错误?

const { 
    spawn 
} = require('child_process'); 

let info = spawn('npm', ["-v"]); 

info.on('close',() => { 
    console.log('closed'); 
} 

但我有此错误:如果我改用

events.js:182 
     throw er; // Unhandled 'error' event 
    ^

Error: spawn npm ENOENT 
    at exports._errnoException (util.js:1022:11) 
    at Process.ChildProcess._handle.onexit (internal/child_process.js:189:19) 
    at onErrorNT (internal/child_process.js:366:16) 
    at _combinedTickCallback (internal/process/next_tick.js:102:11) 
    at process._tickCallback (internal/process/next_tick.js:161:9) 
    at Function.Module.runMain (module.js:607:11) 
    at startup (bootstrap_node.js:158:16) 
    at bootstrap_node.js:575:3 

let info = spawn('npm', ["-v"], {shell: true}); 

它的作品!

但为什么我需要shell: true?我还需要查看该产卵的标准输出,所以我也使用这个:

let info = spawn('npm', ["-v"], {shell: true, stdio: 'inherit'}); 

它是正确的?

回答

1

在调用本身产生的时候,在spawn下没有npm命令。因此你得到了这个错误信息。在添加shell: true的同时,spawn将使用系统的shell来运行该命令,而不是使用spawn本身。由于您的系统有npm,它可以工作。

let info = spawn('npm', ["-v"], {shell: true, stdio: 'inherit'}); It's correct?

如果你的spawn的参数是可控的,那么代码是好的。但一般来说,我建议在不使用shell的情况下使用纯粹的spawn。无需直接接触外壳,风险就会降低。


既然你需要从spawn返回流。我已查看其他解决方案hereWithout shell: true,您可以使用代码:

const { 
    spawn 
} = require('child_process'); 

let projectPath = ''//the path of your project 
let info = spawn('npm', ['-v'], { cwd: projectPath }); 

let result = ''; 
info.stdout.on('data', function(data) { 
    result += data.toString(); 
    console.log(result); 
} 
+0

是的,当然,但我需要的标准输出“活”没有我的命令结束。如何与exec? –

+0

我得到了你使用产卵的原因,你有没有尝试cwd作为参数?我已经更新了代码。请尝试一下。 –

+0

是不是在windows的cwd上工作。我尝试了每种路径模式:绝对,相对,后退和前进斜线。没有。 –

相关问题