0

我正在使用 node.js 构建 Web 服务,并且正在我的服务中注册用户。我正在为我的数据库使用 node.js + mongodb,一旦我创建了一个新用户,我还想为他们创建一个唯一的 id 并将其作为响应发回,就像 fb 等所有伟大的服务将你发回 facebook ID。我不想从 mongodb 发回 _id,那么如何为节点中的每个用户生成一个唯一的 id,最好是这样做还是只发回 mongo _id。

4

4 回答 4

6

这样做更好还是只发回 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()
于 2013-08-08T14:18:58.647 回答
3

使用优惠券代码。这很简单,可以解决大多数生成唯一 ID 的用例。

https://github.com/appsattic/node-coupon-code

https://github.com/broofa/node-uuid

于 2013-08-08T10:16:58.757 回答
1

例如,默认情况下不发回 Mongoose 创建的 _id 有很多很好的理由。一方面,这些 ID 很容易被流氓实体或黑客猜到。而且无论如何公开您的数据库ID也不是一个好主意。

对于仅依赖唯一 ID 进行无密码帐户访问的应用程序,生成高度唯一的哈希 ID 可能是最佳选择。完美的节点模块是hashids

你也可以试试加密:

require('crypto').randomBytes(48, function(ex, buf) {
  var token = buf.toString('hex');
});

祝你好运!

于 2014-01-02T06:40:46.140 回答
0

使用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。它快如闪电。

于 2013-08-09T03:15:24.087 回答