JSON Stringify会在Redis发布时忽略嵌套对象

时间:2019-05-29 09:16:27

标签: javascript node.js json mongoose redis

我在后端使用Redis扩展订阅。我正在使用this库在我的JavaScript代码之上实现redis。并在模型中使用猫鼬。

在发布Redis期间,我必须对从猫鼬得到的对象进行字符串化处理。我在订阅端解析它们,并且一切工作良好,直到对象中需要嵌套化的嵌套对象为止。

所以,如果我的对象是这个:

{ subtitle: '',
   description: '',
   checklists:
    [ { _id: 5cee450c0fa29d0b54275da0, items: [] },
      { _id: 5cee455c0c31785b0875e09d, items: [] },
      { _id: 5cee47dc6d32e72c6411ce2d, items: [] } ],
   attachments: [],
   labels: [],
   _id: 5ced1af26547233798f943f6,
   title: 'asfasf',
   box: 5cece1c3e6c3c13ff098658d,
   workflow: 5cece1cbe6c3c13ff0986591,
}

我收到:

{ cardUpdated:
    { 
      subtitle: '',
      description: '',
      checklists: [ [Object], [Object], [Object] ],
      attachments: [],
      labels: [],
      _id: '5ced1af26547233798f943f6',
      title: 'asfasf',
      box: '5cece1c3e6c3c13ff098658d',
      workflow: '5cece1cbe6c3c13ff0986591',
    } 
}

发布时,我使用以下行:

pub.publish(types.CARD_UPDATED,
          JSON.stringify(
            { cardUpdated: await getUpdatedCardStats(checklist.card) },
          ));

注意:我知道我在{}中包装了stringify的参数,没有它,嵌套的对象将不会被忽略,但是我需要这样做,因为我需要订阅端的键属性名称,即我在几个地方使用了不同名称的publish命令。

有没有办法使嵌套对象进行字符串化处理?

编辑:结果是,我在Redis的订阅端获得了适当的完整对象作为字符串,但实际上是罪魁祸首JSON.parse()。解析后,它将完全忽略嵌套对象。反正有避免这种情况吗?

2 个答案:

答案 0 :(得分:1)

尝试:

const value = JSON.stringify({
    cardUpdated: await getUpdatedCardStats(checklist.card)
});
pub.publish(types.CARD_UPDATED, value);

答案 1 :(得分:0)

这不是有效的JS对象:

{ _id: 5cee450c0fa29d0b54275da0, items: [] }

我认为这是.toString()类型的对象的{_id: ObjectId, items: any[]的输出,其中ObjectId定义为here。无论如何,此对象的JSON化都不是小事,这就是JSON.stringify仅输出[Object]的原因。

要绕过此限制,您可以实现一个自定义函数,以将对象转换为可以进行JSON转换的对象,可能需要借助ObjectId.toString()