2017-07-08 5 views
0

私はこのコードを使用しています:Windowsでchild_processが生成されたNodeJsスクリプト。なぜENOENTエラーのために 'shell:true'が必要なのですか?

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

スポーン自体を呼び出している間、スポーンの下にnpmコマンドはありません。したがって、そのエラーメッセージが表示されます。スポーン自体を使用する代わりに、shell: trueを追加している間、スポーンはシステムのシェルを使用してそのコマンドを実行します。あなたのシステムはnpmなので、動作します。

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

spawnのパラメータが制御可能な場合は、コードは問題ありません。しかし、一般的には、シェルを使わずに純粋なスポーンを使うことをお勧めします。シェルはシェルに直接触れることなくリスクが低下します。


spawnからのストリームリターンが必要なためです。私は他の解決策hereをチェックしました。もちろん、

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

はい、私はstdoutがない私のコマンドの末尾に「生きる」必要があります。Without shell: trueは、あなたは、コードを使用することができます。どのようにexecと一緒に? –

+0

私はスポーンを使用するあなたの理由がある、パラメータとしてcwdを試してみましたか?私はコードを更新しました。試してみてください。 –

+0

Windows上でcwdが動作していません。私はすべてのパスモードを試しました:絶対、相対、前後、スラッシュ。何もない。 –

関連する問題