传入的参数必须是 24 个十六进制字符的字符串 - 我认为是

Argument passed in must be a string of 24 hex characters - I think it is

我有一种方法可以根据其 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()行。

我在该调用之前的控制台日志将 id 输出为 24 个十六进制字符的字符串:

id: "55153a8014829a865bbf700d" type: string

在此之前,我使用 JSON.stringify() 将 id 从一个对象转换为一个字符串,但它似乎工作成功,如我的 console.log.

所示

运行 db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")}) 在 Robomongo 中返回预期结果。

试试 ObjectID(id) 而不是 new ObjectID(id)

在本例中,传入我的函数的 ID 已经是对象 ID,因此不需要从中创建新的 ObjectID。

当 ObjectID 被注销到控制台时,它们显示为十六进制字符串,而不是 ObjectID("hexString"),所以我想我需要转换它来进行查找,但它已经是我需要的格式.

试试这个:

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 objectId = new ObjectID(productId.trim());                                       
    product = await db?.collection('products').find({ _id: objectId }).next();

找到源码了,

确保该值不能有任何空格,

你可以使用 const ID = id.trim(); then use ObjectId(ID)

谢谢 快乐编码

传入的参数必须是24个十六进制字符的字符串 如果你收到这个错误。 就这样做

使用 .trim() 删除任何多余的字符,通常会在 id 中添加 space。它变成了 25 hex charater 。 所以不是 _id = yourId; 使用 _id = yourId.trim()

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

res.body 上使用 map() -- 它对我有用。

const ID = (req.body.id).trim();

对我有用,实际上 (req.body.id) 向 ID 变量添加了一个额外的 space。

在我使用 .trim() 方法后它起作用了。

所有答案我都试过了。但这对我不起作用。也许如果你正在使用 express 获取参数。它对我有用。试试这个;

var MongoClient = require('mongodb').MongoClient;
const {ObjectId} = require('mongodb');

app.get('/:id', (req, res) => {

var reqId = req.params.id
var query = reqId.toString()


MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("AllDB");
    dbo.collection("Events").findOne({_id: ObjectId(query)}, function(err, result) {
        if (err) throw err;
        res.send(result)
        db.close();
      });
});

})

更新:

嘿,我又报了同样的错误,我注意到了新的解决方案。如果您的代码是这样的:

app.get('/', (req, res) => {
    res.send('TEST')
})


app.get('/:id', (req, res) => {

   var reqId = req.params.id
   var query = reqId.toString()

})

您可以尝试更改您的获取请求路由吗?也许如 app.get('/findid/:id)

它对我有用。我又找了一下,找到了这个。

谢谢,问候。

我遇到了同样的错误。后来我发现我在向服务器发送值时包含了一个空格。

<input type="checkbox" name="checkbox" value="<%= item._id %>" onchange="this.form.submit()" />
  

在我输入的值属性中 value="<%= item._id %> " 。 ID 后的空格。它导致了那个错误。我去掉后(value="<%= item._id %>" ),问题解决

下面的代码对我有用。

item.findOne({'_id':id} , (err)=>{

if(err){
  console.log(err);
}
else{
  console.log("Item Found");
}

});

实际上您正在获取的 ID 中有空格,因此将 trim() 添加到您的 ID 中就可以了

const id = (req.params.id).trim();
const result =  await deleteOne({_id:new mongodb.ObjectId(id)});

在使用此代码时请记住,您的函数应该是异步的,并且 mongodb 应该已被导入。

有时清除本地存储可能是解决此错误的方法。从 'inspect' 转到应用程序 > 本地存储和 select URL。然后按 'clear all' 符号。它对我有用。