【问题标题】:Node.js child_process has no access to global modulesNode.js child_process 无法访问全局模块
【发布时间】:2020-01-29 18:43:01
【问题描述】:

我已经在我的 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)

我上面的脚本只是一个测试用例,因为在vue-cli-plugin-cordovaquasar 中添加/运行cordova 特定内容时遇到问题。我追查了一下,全局路径是问题所在。

更新

我想我找到了问题,但不知道如何解决。将 /bin/bash 设置为 shell 时,它可以工作:

cmd = spawn('cordova', ['-v'], {
    shell: '/bin/bash'
});

不确定,为什么需要这样做以及为什么包 vue-cli-plugin-cordovaquasar 不这样做。

【问题讨论】:

    标签: node.js npm spawn


    【解决方案1】:

    好的,经过数小时的研究和试用,我已经卸载了node,安装了nvm和最新的node,设置了

    nvm use --delete-prefix v13.7.0 --silent >> /dev/null
    

    并将其添加到~/.bashrc

    现在一切正常

    【讨论】:

      【解决方案2】:

      如何解决我的错误,我将环境变量 PATH: 更改为 C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{加上程序路径}

      这是 C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\nodejs 在我的路径中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多