REST API(Mongo DB)参数错误500

时间:2013-11-14 08:18:37

标签: node.js mongodb

我的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如下所示:

{    “标题”:“标题”,    “givenname”:“Vorname”,    “姓氏”:“Nachname”,    “名字”:“Vorname Nachname”,    “username”:“Benutzername”,    “密码”:“Kennwort”,    “email”:“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的新手。 : - )

1 个答案:

答案 0 :(得分:0)

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

只需插入包含您的好ID的文档:

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

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

修改

  

在Mysql中我从5XXXX启动了Ids并使用它们。我怎么能用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位数吗?

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