传入的参数必须是24个hex字符的string – 我认为是
我有一个方法来根据它的ObjectID在我的数据库中find一个文档:
console.log('id: ' + id + ' type: ' + typeof id); collection.findOne({'_id':new ObjectID(id)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } });
当我运行它时,我得到以下错误:
/myPath/node_modules/monk/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/connection/base.js:245 throw message; ^ Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters at new ObjectID (/myPath/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:38:11) at /myPath/collectionDriver.js:134:41
这是指上面的collection.findOne()
行。
在调用之前,控制台日志以24个hex字符的string输出id:
id: "55153a8014829a865bbf700d" type: string
在此之前,我使用JSON.stringify()
将ID从一个对象转换为string,但它似乎成功地运行,如我的console.log所示。
在db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})
运行db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})
将带来预期的结果。
传入我函数的id在这种情况下已经是一个对象ID,所以不需要从它创build一个新的ObjectID。
当ObjectIDs注销到控制台时,它们显示为hexstring,而不是ObjectID("hexString")
,所以我认为我需要将其转换为执行查找,但它已经在我需要的格式。
尝试ObjectID(id)
而不是new ObjectID(id)
在我的情况下,这工作:
var myId = JSON.parse(req.body.id); collection.findOne({'_id': ObjectID(myId)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } });
不要忘记在开头包括:
var ObjectId = require('mongodb').ObjectID;
尝试这个:
var hex = /[0-9A-Fa-f]{6}/g; id = (hex.test(id))? ObjectId(id) : id; collection.findOne({'_id':new ObjectID(id)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } });