我正在使用 node.js 构建 Web 服务,并且正在我的服务中注册用户。我正在为我的数据库使用 node.js + mongodb,一旦我创建了一个新用户,我还想为他们创建一个唯一的 id 并将其作为响应发回,就像 fb 等所有伟大的服务将你发回 facebook ID。我不想从 mongodb 发回 _id,那么如何为节点中的每个用户生成一个唯一的 id,最好是这样做还是只发回 mongo _id。
4 回答
这样做更好还是只发回 mongo _id
如果你非要问,最好只发回 mongo _id。除非你有铁定的推理支持为什么这种简单、直接、让每个人都容易生活的技术是有问题的,否则无论如何,只要发回 mongo _id。
如果您认为 mongo _id 对您来说不够好(可能是由于 FUD 而不是任何现实的推理),您将面临以下额外挑战,但没有任何好处:
- 你必须更仔细地考虑你的索引
- 辅助库功能
findById
不再适合您 - 现在,每条记录都有 2 个巨大的、难以察觉的 ID 来处理
- 像猫鼬这样的辅助库也将难以利用
- 在应用程序的整个生命周期中,您必须在调试过程中不断地
_id
来回映射mySuperAwesomeExtraneousId
吻
也就是说,你总是可以只使用一个额外的 mongo ObjectId
,因为它们是完全有效的唯一 ID:
const mongo = require('mongodb')
let mySuperAwesomeExtraneousId = new mongo.ObjectID()
使用优惠券代码。这很简单,可以解决大多数生成唯一 ID 的用例。
例如,默认情况下不发回 Mongoose 创建的 _id 有很多很好的理由。一方面,这些 ID 很容易被流氓实体或黑客猜到。而且无论如何公开您的数据库ID也不是一个好主意。
对于仅依赖唯一 ID 进行无密码帐户访问的应用程序,生成高度唯一的哈希 ID 可能是最佳选择。完美的节点模块是hashids
你也可以试试加密:
require('crypto').randomBytes(48, function(ex, buf) {
var token = buf.toString('hex');
});
祝你好运!
使用http://mongoosejs.com作为 MongoDB 的抽象层。它将确保您始终拥有可用的 _id。它还将管理许多其他事情,例如验证、连接等。
优点:它比原始驱动程序更易于使用,同时保持原始 MongoDB 驱动程序的所有功能。访问 mongoose 网站后,您将在大约 20 分钟内启动并运行。这是为数不多的不为简单而牺牲功率的情况之一。它是一个薄抽象层,通过拥有这个单一的、健壮的层,然后尝试在需要访问数据库的代码的每个部分上重新发明轮子,您将在代码中获得净性能提升。它支持每一个 MongoDB 功能。它提供验证。它提供了一个简单的界面来管理索引。它会自动创建数据库和集合。由为 node.js 制作 ExpressJS、Socket.IO 和 Mocha 的同一个人构建。名单还在继续。
缺点:不支持多个 MongoDB 连接。这通常不是问题,因为您很可能会在需要创建到多个 MongoDB 集群的多个连接之前使用 MongoDB 的分片功能。它有一个愚蠢的名字。
我们在生产环境中使用 Mongoose 已经有一段时间了。如果您想看到它的实际效果,请访问 ZingProject.com。它完全是 node.js + mongoose 而不是 MongoDB。它快如闪电。