NodeJS无法序列化ES6 Map。

5

这是我的示例javascript代码在node.js中执行

let commutertrip = new Map();
let t = {
    userId: 1,
    capacity: 4,
    commuteId: 1,
    endTime: new Date(),
    id: 1,
    status: "QUEUED",
    startTime: new Date(),
    price: 100
};
commutertrip.set(1, t);
let trip = {
    id: 2,
    poolerId: 3,
    poolerTrip: {
        capacity: 4,
        commuteId: 8,
        id: 1,
        endTime: new Date(),
        startTime: new Date(),
        status: "QUEUED",
        price: 55,
        userId: 1
    },
    commuterTrip: commutertrip,
    status: "QUEUED"
};
console.log(JSON.stringify(trip));

输出
{"id":2,"poolerId":3,"poolerTrip":{"capacity":4,"commuteId":8,"id":1,"endTime":"2016-07-27T06:59:51.773Z","startTime":"2016-07-27T06:59:51.773Z","status":"QUEUED","price":55,"userId":1},"commuterTrip":{},"status":"QUEUED"}

我找不到如何修复这个问题?同样的javascript代码在这里可以正常工作。 以下是节点参数:node --debug-brk=33172 --nolazy --harmony bin\www


它不行,因为并非每个Map都是可序列化的。你必须亲自手动完成以下步骤:1.将您的映射转换为普通JS对象2.对其进行序列化。 - zerkms
@zerkms,拥有地图功能有什么意义呢?好像你永远也无法将地图转换为JSON。与其使用Maps,不如声明自己的对象。 - RaceBase
重点是拥有一种数据结构,可以将任意类型的键与任意类型的值关联起来。 - zerkms
@zerkms,我同意。如果您需要在将被序列化的对象中包含这些内容,我们该如何解决? - RaceBase
然后,您可以使用可序列化的数据结构。例如:普通的JS对象。 - zerkms
1个回答

1
这里的问题不在于你的代码,甚至不在于NodeJS。主要原因是Set和Map无法被序列化。但是,你可以在序列化之前将它们转换为数组:

var map = new Map([[1, 2], ['foo', 3], [[23, 43], 'bar']])
var data = { number: 23, myKey: map };

var serialized = JSON
  .stringify(data, (k, v) => (v instanceof Map) ? [...v] : v);

console.log(serialized);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接