source

전달된 인수는 24개의 16진수 문자로 구성된 문자열이어야 합니다.

manysource 2023. 6. 24. 09:18

전달된 인수는 24개의 16진수 문자로 구성된 문자열이어야 합니다.

데이터베이스에서 오브젝트를 기반으로 문서를 찾는 방법이 있습니다.ID:

      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개의 16진수 문자로 출력합니다.

id: "55153a8014829a865bbf700d" type: string

이 전에 나는 다음을 사용하여 id를 객체에서 문자열로 변환합니다.JSON.stringify()그러나 내 console.log에 표시된 것처럼 성공적으로 작동하는 것 같습니다.

입니다.db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})로보몽고에서 기대했던 결과를 가져옵니다.

함수에 전달된 ID는 이 경우 이미 개체 ID이므로 새 개체가 필요하지 않습니다.생성할 ID입니다.

개체일 때ID는 콘솔에 로그아웃되고 16진수 문자열로 표시됩니다.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;

네, 저는 이것에 당황해서 30분을 보냈습니다.여기에 있는 사람이 있으면 먼저 개체로 변환해야 하는지 확인합니다.애당초 아이디.OP와 마찬가지로, 나는 16진수 문자열이 단지 16진수 문자열로 기록된다는 것을 잊었습니다.

시험삼아 해보기ObjectID(id)대신에new ObjectID(id)

실제로 가져오는 ID에는 공백이 있으므로 ID에 트림()을 추가하면 작동합니다.

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

이 코드를 사용하는 동안 함수는 비동기여야 하고 mongodb는 가져와야 한다는 것을 명심하십시오.

같은 문제를 겪고 있었지만 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개의 16진수 문자 문자열이어야 합니다. 이렇게 하십시오.

.syslog를 사용하여 추가 문자를 삭제합니다. 보통 ID에 공백이 추가되고 25개의 16진수 문자가 됩니다. 따라서 _id = yourId 대신 _id = yourId.trim()을 사용합니다.

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

사용하다map()에서res.body저한테는 효과가 있어요.

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

사실은 나를 위해 일했습니다.(req.body.id)ID 변수에 공백을 추가합니다.

사용 후.trim()그것이 효과가 있었던 방법.

저도 같은 오류가 발생했습니다.나중에 서버에 값을 보내는 동안 공백을 포함했습니다.

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

});

나는 모든 답을 시도했습니다.하지만 저한테는 효과가 없어요.아마도 당신이 급행으로 파라마를 받고 있다면요.저한테는 효과가 있어요.사용해 보십시오.

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)과 같은 것일 수 있습니다.

그것은 나에게 효과가 있었다.제가 다시 검색해보니 이 길을 찾았습니다.

감사합니다, 잘 부탁드립니다.

로컬 스토리지를 지우는 것이 이 오류의 해결책이 될 수도 있습니다.'inspect'에서 Application > local storage로 이동하여 URL을 선택합니다.그런 다음 '모두 지우기' 표시를 누릅니다.그것은 나에게 효과가 있었다.

언급URL : https://stackoverflow.com/questions/30051236/argument-passed-in-must-be-a-string-of-24-hex-characters-i-think-it-is