【问题标题】:How to use fork in order to run NPM scripts?如何使用 fork 来运行 NPM 脚本?
【发布时间】:2020-02-28 00:10:04
【问题描述】:

我有一个在 CLI 中运行良好的 NPM 启动脚本。 我正在尝试使用fork(),因此它将运行一个子进程,然后该子进程会将一些数据返回给父进程。然后使用 node-cron 调度程序每天运行它。

当我使用这样的简单 exec 时它可以工作

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 有关? 这是 package.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"
  }
}

【问题讨论】:

    标签: javascript node.js fork child-process


    【解决方案1】:

    Fork应该指向一个文件,你不需要{silent:true},让fork的进程继承父stdio。

    查看下面的演示

    parent.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)
    });
    

    child.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);
    
    });
    

    【讨论】:

    • 还是不行。可能与 babel-node 有关吗?已在原帖中添加了 package.json。
    • 我的回答很好。使用您期望工作的当前代码和 nodejs 版本更新您的帖子
    • 在这种情况下它不会运行脚本。请看cp.exec,那个版本运行脚本很好。
    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2017-03-26
    • 2018-07-25
    • 1970-01-01
    • 2016-04-28
    • 2016-08-28
    • 2016-01-03
    • 2020-11-28
    相关资源
    最近更新 更多