我正在尝试将数据(作为对象)发送到Node.js中的子进程,但是,我的所有正则表达式都在传输中丢失。
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.on('message', function (data) {
console.log(data);
});
child.send(arguments);
在child.js文件中,我将其放在顶部:
process.on('message', function () {
console.log(arguments); // This is where the data has changed
});
当从子进程输出日志时,arguments对象看起来像这样:
{
something: {
name: 'test',
age: 28,
active: true
},
otherThing: 'some string',
regex: {},
regex2: {}
}
到目前为止,无法在其他地方找到有关为什么会发生这种情况的任何想法,任何想法?
答案 0 :(得分:3)
因为它们是完全独立的JavaScript进程,所以您无法发送对象。传递对象时,它会被序列化为JSON并由子进程解析。 (见the docs。)
JSON不支持序列化正则表达式对象。 (尝试通过控制台放置JSON.stringify(/abc/)
- 您将返回"{}"
。)
要在JSON对象中包含正则表达式,可以使用json-fn
模块。它支持序列化函数,日期和正则表达式。 (这实际上要归功于我提出的一个问题,即他们添加了正则表达式支持。:))
然后您可以执行以下操作:
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));
和
var JSONfn = require('json-fn');
process.on('message', function (data) {
console.log(JSONfn.parse(data))); // This is where the data has changed
});
答案 1 :(得分:0)
您可以将正则表达式存储为类似
的字符串 $sql="INSERT INTO expiredEvents
(event_id,sport_type,tournament,round,team1,team2,venue,event_date)
values ('$id','$sport','$trnmnt','$rnd','$t1','$t2','$ven','$eDate')
WHERE event_id = '$id'"
将其发送给孩子,然后像
一样使用它myRegex.string = "/test/";
myRegex.modif = "i";
答案 2 :(得分:0)
我尝试过 json-fn,但字符串化的 Date 对象不会恢复为 Date。该模块 JSON4Process 将对象的属性类型字符串化为 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));