0

我的 REST API 有问题。它不会与 mongodb 正确通信。Node.js 抛出以下异常:

错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串

我的经理如下所示:

app.get('/users/:id', function(req, res) {
userProvider.fetchUserById(req.params.id, function(error, user) {
  if (user == null) {
    res.send(error, 404);
  } else {
    res.send(user);
  }
});

});

我的提供者如下所示:

this.fetchUserById = function(id, cb) {
this.db.collection(usersTable, function(error, users) {
  if (error) {
    cb(error, null);
  } else {
    users.findOne({
      _id:users.db.bson_serializer.ObjectID.createFromHexString(id)
    }, function(error, result) {
      cb(error, result);
    });
  }
});

};

我的 Mongoobject 如下所示:

{ “title”:“title”,“givenname”:“Vorname”,“lastname”:“Nachname”,“name”:“Vorname Nachname”,“用户名”:“Benutzername”,“密码”:“Kennwort”, “电子邮件”:“kuerzel@emailadresse.de”,“电话”:“0000 - 000000”,“传真”:“000000 - 000000”,“lastlogin”:“15.11.2013”​​,“createdate”:“15.11.2013 ”,“更改日期”:“15.11.2013”​​,“状态”:“1”,“_id”:ObjectId(“5283fbf56e3adb01f1000001”)}

当我现在发送 GET: /users/1 时,将引发错误。

我是 Node.js 的新手。:-)

4

1 回答 1

0

如果您的人类可读 ID 是唯一的,则可以使用它们。

只需插入带有您漂亮 ID 的文档:

db.users.insert({ _id: myVeryNiceUniqueId, title: '...' }, ...);

作为替代方案,您可以向文档添加一个额外的“外部 id”并创建一个唯一索引。但是当你想要扩展(分片)时,你会遇到很多很多问题。谁将创建唯一 ID?我保证,你会得到一些不那么人类可读的东西。

编辑

在 Mysql 中,我从 5XXXX 开始 Id 并使用它们。我怎样才能用 mongodb 实现这一点

你应该问另一个问题或搜索答案。这不是一项微不足道的任务,您必须考虑并发性。也许findAndModify或“Upsert”的概念可以帮助你。最重要的事情之一是您需要一种对 ID 生成器进行原子更新的方法。在过去的一个项目中,我为此使用了Redis,但从那时起我一直使用 MongoDB ID。您应该知道 MongoDB ObjectID 通常由 Client-Driver 生成。对于 REST 服务,这是理想的:将文档保存到数据库并返回状态 201 Created,url=.../user/98357348957。

顺便提一句。我应该通过检查集合中外部 id 的最大值来生成 Javascript 中的 OrderID 吗?

如前所述,当您的服务器处于高争用状态时,您可能会遇到使用重复 ID 的麻烦。尝试使用findAndModify或缓存一组 ID 的解决方案并在一个进程中使用它们。我可能不会搜索 max 和 increment 而是使用一个特殊的集合进行 ID 管理。

这里的最佳做法是什么?

不知道。使用 ID 生成器。取决于您的环境(单进程,单机)。如果这是一个简单的设置,您会找到简单的解决方案。Twitter 的设置并不简单,他们开发了一个名为twitter/snowflake的解决方案。如果你真的想要非常好的、短的 ID,但是你有不止一个进程/机器,那么 Redis 可能会是你想要的。如果 ID 不必是连续的(没有小的间隙),您可以绘制一堆新的 ID(例如 100)并将它们缓存以供每个进程将来使用。

我可以将 objectID 散列为 5 位数字吗?

不,不能保证这个号码是唯一的。

于 2013-11-14T08:43:58.143 回答