Node.js/mongoDB - 如何在客户端和Web服务器之间管理ObjectIDs

3
使用Node.js 4.2.4和mongoDB 3.2
关注点分离-保持客户端与mongoDB解耦
问题:
我习惯于从服务器以字符串形式发送id并从客户端以字符串形式读取它们,但是由于mongoDB使用ObjectIDs,我感到困惑,因为从逻辑上讲,为了使客户端与数据库脱钩,需要在ObjectIDs和它们的字符串等价物之间来回转换。
澄清问题:
1) 当数据被发送到客户端时,我假设通常使用ObjectIDs将UI交互映射到数据(例如用户点击帖子)。 在这样做时,我需要将ObjectIDs强制转换为字符串,以便客户端使用,并在它们返回服务器端时将它们转换回ObjectIDs吗?
2) 是否应该在服务器端完成所有键生成和类型转换(如果需要)? (要么与node服务器耦合,要么与数据库和web服务器之间有一层)
2个回答

1

1) 是的。

2) 可以将 ObjectId 转换为字符串进行传输(通常是 JSON 格式),需要查询数据库时再将其转换回 ObjectId。客户端只需知道它是表示对象的任意字符串即可。


那么,如果我发送一个包含ObjectID和带有ObjectIDs的嵌入式文档的JSON表示形式的文档,那么我是否需要知道文档结构并在将文档转换为JSON之前手动更改_ids为字符串的逻辑? - Nick Pineda
重要提示:如果您将响应发送为JSON,则会注意到您的ObjectID自动转换为字符串。 - Nick Pineda
如果您使用Mongoose,可以使用doc.toJSON(),但本地的JSON.stringify()将无法工作。 - Pier-Luc Gendreau

1
使用npm bson-util 可以是将bson数据发送到客户端的合适方式。此外,您还可以在客户端再次将数据解析为bson。

import {parse, stringify} from 'bson-util';

let a = {b: new ObjectID()};
 
stringify(a); 
// {"b":{"$oid":"5e32849068f40e424a80fe42"}}
 
parse('{"b":{"$oid":"5e32849068f40e424a80fe42"}}'); 
// {b: ObjectID("5e32849068f40e424a80fe42")}


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