传入的参数必须是 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' 符号。它对我有用。
我有一种方法可以根据其 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' 符号。它对我有用。