【问题标题】:Argument passed in must be a string of 24 hex characters - I think it is传入的参数必须是 24 个十六进制字符的字符串 - 我认为是
【发布时间】:2015-07-15 02:01:51
【问题描述】:

我有一种方法可以根据 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 中所示。

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

【问题讨论】:

    标签: node.js mongodb monk


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,但这不会改变结果。
    • 我刚刚尝试了以下代码,它可以识别十六进制字符串:var ObjectID = require('mongodb').ObjectID;ObjectID.createFromHexString('55153a8014829a865bbf700d') 55153a8014829a865bbf700d
    • 是的,对我也一样,但不是我的输入,这显然不是它看起来的十六进制字符串。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的解决方案。我也遇到了这个问题,但是,如果我删除 ObjectId(...) 我得到一个 Invalid Arg Type Error。如果我留下对象 ID,它可以工作,但我每次都会收到此错误消息。对此有什么想法吗?
    【解决方案3】:

    试试这个:

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

    【讨论】:

    • 这个答案出现在低质量审查队列中,大概是因为您没有提供任何代码解释。如果此代码回答了问题,请考虑在答案中添加一些解释代码的文本。这样一来,您就更有可能获得更多支持,并帮助提问者学习新知识。
    【解决方案4】:

    就我而言,这是有效的:

    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;
    

    【讨论】:

      【解决方案5】:

      是的,我只花了 30 分钟对此感到困惑。如果有人发现自己在这里,首先检查您是否需要首先转换为 ObjectID。像 OP 一样,我忘记了十六进制字符串就是这样记录的 - 一个十六进制字符串。

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,但修剪传递给 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();
        

        【讨论】:

          【解决方案7】:

          我找到了这个的来源,

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

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

          谢谢 快乐编码

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:
                const ID = (req.body.id).trim();
                

                为我工作,实际上(req.body.id) 为 ID 变量添加了一个额外的空间。

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

                【讨论】:

                  【解决方案11】:

                  我已经尝试了所有答案。但这对我不起作用。也许如果您使用 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)

                  它对我有用。我再次搜索,我找到了这种方式。

                  谢谢,问候。

                  【讨论】:

                    【解决方案12】:

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

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

                    在我输入为value="&lt;%= item._id %&gt; " 的值属性中。 ID 后面的空格。它导致了那个错误。删除后(value="&lt;%= item._id %&gt;" ),问题就解决了。

                    下面的代码对我有用。

                    item.findOne({'_id':id} , (err)=>{
                    
                    if(err){
                      console.log(err);
                    }
                    else{
                      console.log("Item Found");
                    }
                    

                    });

                    【讨论】:

                      【解决方案13】:

                      实际上,您要获取的 Id 中包含空格,因此将 trim() 添加到您的 id 将起作用

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

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-09-11
                        • 2023-02-09
                        • 1970-01-01
                        相关资源
                        最近更新 更多