Node.js子进程中数据丢失
Data loss in Node.js child process
我正试图将数据(作为对象)发送到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
});
当从子进程输出日志时,参数对象看起来像这样:
{
something: {
name: 'test',
age: 28,
active: true
},
otherThing: 'some string',
regex: {},
regex2: {}
}
到目前为止,无法在其他地方找到任何关于为什么会发生这种情况的信息,有什么想法吗?
因为它们是完全独立的JavaScript进程,所以你不能发送对象。当您传递一个对象时,它被序列化为JSON并由子对象解析。(见文档)
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
});
您可以将正则表达式存储为字符串,如
myRegex.string = "/test/";
myRegex.modif = "i";
发送给子节点,然后像
一样使用new RegExp(myRegex.string, myRegex.modif);
我尝试了json-fn,但日期对象字符串化后没有恢复到日期。这个模块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。使用json4process:
对修改过的对象进行字符串化let newObj = JSON.stringify(JSON4Process.stringifyProps(obj));
let originalObj = JSON4Process.parseProps(JSON.parse(newObj));
相关文章:
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 如何使用 Angular JS 将数据保存在数据库中
- JS验证ajax返回的html中的表单数据
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 如何使用下划线js转换这些数据
- node.js请求数据事件未在CORS ajax调用中触发
- 通过连线将数据从js发送到控制器
- 在每次文件上传时发送带有放置区的自定义数据.js
- 节点.js 如何通过基本 Passport 在数据会话中维护所需的数据.js
- 如何从 c3 获取数据.js
- 存储来自多个回调节点的数据.js javascript
- 为什么我不能在 Angular JS 服务中更改数据.js执行函数后
- 在 vis 中访问节点数据.js单击处理程序
- 为什么使用 D3 显示数据.js看起来是截断的
- 检索车把中的专用阵列数据.js模板
- 如何使用挖空恢复模板中的数据.js
- 如何从节点中获取数据.js http get request
- 如何在角度图中实现这些数据.js
- 尝试复制 json 数据 js 时出现类型错误
- 如何在基于 Backbone 的模板中添加数据.js元素