我的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的新手。 : - )
答案 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位数吗?
不,不能保证这个号码是唯一的。