将对象作为参数发送到分叉的nodejs进程

时间:2016-05-18 13:06:54

标签: node.js

主进程中有fork('./MyProcess.js',['foo']);,分叉进程中有console.log(process.argv[2]);会将 foo 记录到我的控制台。

但是,主进程中的fork('./MyProcess.js',[{myProp : 'bar'}]);和分叉进程中的console.log(process.argv[2]); console.log(process.argv[2].myProp);将记录 [object Object] (如预期的那样),但 undefined 对于第二个日志。

为什么会这样,我该怎么做才能获得理想的行为?

4 个答案:

答案 0 :(得分:4)

通过commadline参数将对象(json)传递给子进程不是一个好主意,命令参数首先需要转义(不容易)。你有一些选择:

  1. 十六进制编码json,然后传递给子进程,这可行,但你的子进程接口是坏的。
  2. 将json保存到文件中,改为传递文件路径。
  3. 通过stdin将json传递给子进程。
  4. 将json作为消息发送给子进程,请参阅https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_options_callback

答案 1 :(得分:3)

child_process.fork的文件中所述:

  

child_process.fork(modulePath [,args] [,options])

     

args 字符串参数列表

通过执行fork('./MyProcess.js',[{myProp : 'bar'}]),您将传递一个预期字符串的对象。生成的行为可能会依赖于实现,但我在Node.js v6.1.0上的试用表明该对象将转换为字符串' [object Object]'。该字符串不具有myProp属性,因此产生未定义。

解决方案是仅传递字符串:

fork('./MyProcess.js', ['bar']);

如果你关心命名参数,只需要适当地格式化它们(见下文),然后用另一个包(例如yargs)或你自己的解决方案解析它们。在这种情况下,您可以这样做:

fork('./MyProcess.js', ['--myProp=bar']);

为了完整起见,你可以在" MyProcess.js"中找到它:

var argv = require('yargs').argv;
console.log('My prop is: ' + argv.myProp);

答案 2 :(得分:0)

选择 No.5,最好在 env 选项中设置一个 KEY VALUE 对。

// in parent process
fork('./some.js', {
  env: Object.assign(process.env, { HELLO: 'world' })
});
// in forked process <some.js>
console.log(process.env.HELLO);
// world

答案 3 :(得分:0)

您可以对对象进行 base64 编码:

const obj = { foo: 'bar', date: new Date() };
const encoded = Buffer.from(JSON.stringify(obj)).toString('base64');

fork('./MyProcess.js',[encoded]);

在接收端:

const data = process.argv[2];
const decoded = JSON.parse(
  Buffer.from(data, 'base64').toString('utf-8')
);