Node.js child_process не имеет доступа к глобальным модулям - PullRequest
0 голосов
/ 29 января 2020

Я установил npm пакеты глобально в мой Kubuntu 19.04

$ 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

Я могу получить к нему доступ из оболочки

$ 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)

Мой скрипт, приведенный выше, является просто тестовым сценарием, так как у меня есть проблема с добавлением / выполнением cordova Speci c вещи в vue-cli-plugin-cordova и quasar. Я обнаружил, что проблема заключается в глобальном пути.

Обновление

Я думаю, что нашел проблему, но не уверен, как ее решить. При установке / bin / bash в качестве оболочки он работает:

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

Не уверен, зачем это нужно и почему пакеты vue-cli-plugin-cordova и quasar этого не делают.

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Как я решаю свою ошибку, я изменил переменную среды PATH: на C: \ Windows \ system32; C: \ Windows; C: \ Windows \ System32 \ Wbem; {плюс пути к программам} *

, что C: \ Windows \ system32; C: \ Windows; C: \ Windows \ System32 \ Wbem; C: \ Program Files \ nodejs в моем ПУТИ

0 голосов
/ 30 января 2020

Хорошо, после нескольких часов исследований и проб, я удалил узел, установил nvm и последний узел, установил

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

и добавил это к ~/.bashrc

, и теперь все работает

...