Javascript Node.js子进程中的数据丢失

Javascript Node.js子进程中的数据丢失,javascript,regex,node.js,object,child-process,Javascript,Regex,Node.js,Object,Child Process,我试图将数据(作为对象)发送到Node.js中的子进程,但是,我所有的正则表达式都在传输过程中丢失 var参数={ 某物:{ 名称:'测试', 年龄:28, 活跃的;真实的 }, 另一件事:“一些字符串”, regex:/test/i, regex2:新的RegExp('test') }; var child=cp.fork(path.join(_dirname,'child.js')); 子.on('message',函数(数据){ 控制台日志(数据); }); 发送(参数); 在child

我试图将数据(作为对象)发送到Node.js中的子进程,但是,我所有的正则表达式都在传输过程中丢失

var参数={
某物:{
名称:'测试',
年龄:28,
活跃的;真实的
},
另一件事:“一些字符串”,
regex:/test/i,
regex2:新的RegExp('test')
};
var child=cp.fork(path.join(_dirname,'child.js'));
子.on('message',函数(数据){
控制台日志(数据);
});
发送(参数);
在child.js文件的顶部有:

process.on('message',function(){
console.log(arguments);//这是数据更改的地方
});
当从子进程输出日志时,arguments对象改为如下所示:

{
一些东西:{
名称:'测试',
年龄:28,
主动:正确
},
另一件事:“一些字符串”,
正则表达式:{},
regex2:{}
}

到目前为止,我们还无法在其他地方找到任何关于为什么会发生这种情况的信息,有什么想法吗?

您可以将正则表达式存储为字符串形式

myRegex.string = "/test/";
myRegex.modif = "i";
将它发送给child,然后像这样使用它

new RegExp(myRegex.string, myRegex.modif);

因为它们是完全独立的JavaScript进程,所以不能发送对象。当您传递一个对象时,它将被序列化为JSON并由子对象解析。(见附件。)

JSON不支持序列化正则表达式对象。(试着把
JSON.stringify(/abc/)
放到你的控制台上——你会得到
“{}”

要在JSON对象中包含正则表达式,可以使用模块。它支持序列化函数、日期和正则表达式。(实际上,正是由于我提出了一个问题,他们才添加了regex支持。:)

然后,您可以执行以下操作:

var JSONfn = require('json-fn');
var arguments = {
    something: { 
       name: 'test',       
       age: 28,
       active; true          
    },
    otherThing: 'some string',
    regex: /test/i,
    regex2: new RegExp('test')
};

var child = cp.fork(path.join(__dirname, 'child.js'));
});

child.send(JSONfn.stringify(arguments));
以及:


我尝试了json fn,但字符串化的日期对象不会恢复为日期。此模块将对象的属性字符串化,类型为Date、RegExp、Function、Set和Map,同时将对象维护为javascript对象。如果使用fork,则不需要对整个对象进行字符串化,您可以直接发送它

const { fork } = require('child_process');
const JSON4Process = require('json4process');

let obj = {
    date: new Date(),
    regex: new RegExp(/regex/g),
    func: () => console.log('func')
}

obj = JSON4Process.stringifyProps(obj);

const child = fork('child.js');
child.send(obj);
然后将属性解析回另一个文件:

process.on('message', data => {
    let obj = JSON4Process.parseProps(data);
});
如果您需要使用spawn或exec,您可以在修改后的对象上使用默认的JSON.stringify和json4process:

let newObj = JSON.stringify(JSON4Process.stringifyProps(obj));
let originalObj = JSON4Process.parseProps(JSON.parse(newObj));

非常感谢,json fn库正是我所需要的。遗漏了与正在序列化的数据相关的文档部分。
let newObj = JSON.stringify(JSON4Process.stringifyProps(obj));
let originalObj = JSON4Process.parseProps(JSON.parse(newObj));