Как использовать fork для запуска NPM скриптов? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть NPM стартовый скрипт, который хорошо работает с CLI. Я пытаюсь использовать fork(), чтобы он запускал дочерний процесс, затем этот дочерний процесс вернет некоторые данные родительскому процессу. А затем используйте планировщик node-cron для ежедневного запуска.

Это работает, когда я использую простой exe c, как этот

parent. js

const cp = require('child_process');
cp.exec("npm run start argument1 argument2", (err, stdout, stderr) => {
     console.log('exec',stdout)
});

child. js

let data = someCode()
process.stdout.write("data:" + JSON.stringify(data))

Но тогда я не могу вернуть данные родителю, поэтому я попробовал это, что не работает:

parent. js

const cp = require('child_process');
var child = cp.fork("npm run start argument1 argument2", [], { silent: true });

child.on("message", (data) =>{
    console.log('data',data)
})

child. js

let data = someCode()
process.stdout.write("data:" + JSON.stringify(data))
process.send(res)

Он даже не запускает скрипт, но также не возвращает никакой ошибки.

Редактировать : Может быть, это связано с babel-node? Вот как выглядит упаковка. json:

{
  "scripts": {
    "start": "babel-node index.js --",
  },
  "dependencies": {
    "@babel/core": "^7.2.2",
    "@babel/node": "^7.2.2",
    "@babel/preset-env": "^7.3.1",
    "axios": "^0.18.0",
    "memory-cache": "^0.2.0",
    "moment": "^2.24.0",
    "node-cron": "^2.0.3",
    "puppeteer": "2.0.0",
    "puppeteer-firefox": "^0.5.0",
    "shelljs": "^0.8.3"
  }
}

1 Ответ

0 голосов
/ 26 февраля 2020

Fork должен указывать на файл, и вам не нужно {silent:true}, пусть разветвленный процесс наследует родительский stdio.

Проверьте demo ниже:

родитель. js

const {fork} = require('child_process');
var child = fork("./child.js", ['argument1','argument2']);

// send data to child.js
child.send({ hello: 'world' });

// receive data from child.js
child.on("message", (fromChild) =>{
    console.log('Incoming data from child.js', fromChild)
});

ребенок. js

const someCode = ()=> [1,2,3,4,5,6];
let data = someCode();

// send data to parent.js
process.send({data, custom_arguments: process.argv.slice(2)});

// receive data from parent.js
process.on('message', (fromParent) => {

    console.log('Incoming data from parent.js:', fromParent);

});
...