Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 传入的参数必须是一个由24个十六进制字符组成的字符串-我想是的_Node.js_Mongodb_Monk - Fatal编程技术网

Node.js 传入的参数必须是一个由24个十六进制字符组成的字符串-我想是的

Node.js 传入的参数必须是一个由24个十六进制字符组成的字符串-我想是的,node.js,mongodb,monk,Node.js,Mongodb,Monk,我有一种基于ObjectID在数据库中查找文档的方法: console.log('id: ' + id + ' type: ' + typeof id); collection.findOne({'_id':new ObjectID(id)}, function(error,doc) { if (error) { callback(error); } else { callback(null, do

我有一种基于ObjectID在数据库中查找文档的方法:

      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个十六进制字符的字符串形式输出id:

id: "55153a8014829a865bbf700d" type: string
在此之前,我使用
JSON.stringify()
将id从对象转换为字符串,但它似乎工作正常,如我的console.log所示


在Robomongo中运行
db.myCollection.findOne({u id:ObjectId(“55153a8014829a865bbf700d”)
会返回预期结果。

尝试
ObjectId(id)
而不是
新的ObjectId(id)

在这种情况下,传递给我函数的id已经是一个对象id,因此不需要从中创建新的ObjectID

当ObjectID注销到控制台时,它们显示为十六进制字符串,而不是
ObjectID(“hextString”)
,因此我认为需要将其转换以进行查找,但它已经采用了我需要的格式。

尝试以下操作:

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);
  }
});

在我的情况下,这起了作用:

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;

是的,我只是被这件事搞糊涂了三十分钟。如果有人发现自己在这里,首先检查您是否需要首先转换为ObjectID。和OP一样,我忘记了hexstring只是作为一个hexstring记录的

我也遇到了同样的问题,但是修剪传递给ObjectId()的productId对我来说很有效

早些时候:

    const objectId = new ObjectID(productId);
    product = await db?.collection('products').find({ _id: objectId }).next();
现在:


我找到了这个源头

确保该值不能有任何空格

你可以用
const ID=ID.trim();然后使用ObjectId(ID)

谢谢
快乐编码

传入的参数必须是由24个十六进制字符组成的字符串 如果你得到这个错误,那么。 就这么做吧

使用.trim()删除任何额外字符,通常会在id中添加一个空格,然后变成25个十六进制字符。 因此,与其_id=yourId; 使用{u id=yourId.trim()

collection.find({{u id:{$in:req.body.map(pd=>ObjectId(pd))}})


res.body
上使用
map()
——这对我很有用。

谢谢你的建议,但这并不会改变结果。我只是尝试了以下代码并识别了hexstring:
var ObjectID=require('mongodb').ObjectID;ObjectID.createFromHexString('55153a8014829a865bbf700d')55153a8014829a865bbf700d
是的,对我来说也是这样,但对我的输入不起作用,它显然不是看起来的十六进制字符串。这个答案出现在低质量的审阅队列中,可能是因为你没有提供任何代码解释。如果这个代码回答了这个问题,考虑添加一些解释你答案中的代码的文本。这样,你就更有可能获得更多的选票,并帮助提问者学习新的东西。谢谢你的解决方案。我也遇到了这个问题,但是,如果我删除ObjectId(…),我会得到一个无效的Arg类型错误。如果我保留对象Id,它会工作,但每次都会收到此错误消息。有什么想法吗?
    const objectId = new ObjectID(productId.trim());                                       
    product = await db?.collection('products').find({ _id: objectId }).next();