我在后端使用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()
。解析后,它将完全忽略嵌套对象。反正有避免这种情况吗?
答案 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()。