Node.js child_process 无法访问全局模块
Node.js child_process has no access to global modules
我已经在我的 Kubuntu 19.04 中全局安装了一个 npm 包
$ npm install -g cordova
/home/username/.npm-global/bin/cordova -> /home/username/.npm-global/lib/node_modules/cordova/bin/cordova
+ cordova@9.0.0
updated 1 package in 7.299s
我可以从 shell
访问它
$ cordova -v
9.0.0 (cordova-lib@9.0.1)
但我无法通过 spawn
:
的简单节点脚本访问它
const { spawn } = require( 'child_process' );
const cmd = spawn( 'cordova', [ '-v' ] );
cmd.stdout.on( 'data', data => {
console.log( `stdout: ${data}` );
} );
运行 结果如下:
$ node test1.js
events.js:298
throw er; // Unhandled 'error' event
^
Error: spawn cordova ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:273:12)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn cordova',
path: 'cordova',
spawnargs: [ '-v' ]
}
但是当使用绝对路径时:
const { spawn } = require( 'child_process' );
const cmd = spawn( '/home/username/.npm-global/bin/cordova', [ '-v' ] );
cmd.stdout.on( 'data', data => {
console.log( `stdout: ${data}` );
} );
我得到了预期的结果:
$ node test1.js
stdout: 9.0.0 (cordova-lib@9.0.1)
我上面的脚本只是一个测试用例,因为我对 add/run cordova
vue-cli-plugin-cordova
和 quasar
中的特定内容有疑问。我查了一下,是全局路径的问题。
更新
我想我找到了问题所在,但不确定如何解决。当设置 /bin/bash 为 shell 时,它起作用:
cmd = spawn('cordova', ['-v'], {
shell: '/bin/bash'
});
不确定,为什么需要这个以及为什么软件包 vue-cli-plugin-cordova
和 quasar
不这样做。
好的,经过几个小时的研究和试用,我已经卸载了节点,安装了 nvm 和最新的节点,设置
nvm use --delete-prefix v13.7.0 --silent >> /dev/null
并将其添加到 ~/.bashrc
现在一切正常
我是怎么解决我的错误的,我把环境变量PATH:改成C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
这是
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\程序Files\nodejs
在我的路径中
我已经在我的 Kubuntu 19.04 中全局安装了一个 npm 包
$ npm install -g cordova
/home/username/.npm-global/bin/cordova -> /home/username/.npm-global/lib/node_modules/cordova/bin/cordova
+ cordova@9.0.0
updated 1 package in 7.299s
我可以从 shell
访问它$ cordova -v
9.0.0 (cordova-lib@9.0.1)
但我无法通过 spawn
:
const { spawn } = require( 'child_process' );
const cmd = spawn( 'cordova', [ '-v' ] );
cmd.stdout.on( 'data', data => {
console.log( `stdout: ${data}` );
} );
运行 结果如下:
$ node test1.js
events.js:298
throw er; // Unhandled 'error' event
^
Error: spawn cordova ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:273:12)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn cordova',
path: 'cordova',
spawnargs: [ '-v' ]
}
但是当使用绝对路径时:
const { spawn } = require( 'child_process' );
const cmd = spawn( '/home/username/.npm-global/bin/cordova', [ '-v' ] );
cmd.stdout.on( 'data', data => {
console.log( `stdout: ${data}` );
} );
我得到了预期的结果:
$ node test1.js
stdout: 9.0.0 (cordova-lib@9.0.1)
我上面的脚本只是一个测试用例,因为我对 add/run cordova
vue-cli-plugin-cordova
和 quasar
中的特定内容有疑问。我查了一下,是全局路径的问题。
更新
我想我找到了问题所在,但不确定如何解决。当设置 /bin/bash 为 shell 时,它起作用:
cmd = spawn('cordova', ['-v'], {
shell: '/bin/bash'
});
不确定,为什么需要这个以及为什么软件包 vue-cli-plugin-cordova
和 quasar
不这样做。
好的,经过几个小时的研究和试用,我已经卸载了节点,安装了 nvm 和最新的节点,设置
nvm use --delete-prefix v13.7.0 --silent >> /dev/null
并将其添加到 ~/.bashrc
现在一切正常
我是怎么解决我的错误的,我把环境变量PATH:改成C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
这是 C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\程序Files\nodejs 在我的路径中