webentwicklung-frage-antwort-db.com.de

Kann ich feststellen, ob eine Zeichenfolge eine MongoDB-Objekt-ID ist?

Ich mache MongoDB-Lookups, indem ich eine Zeichenfolge in BSON konvertiere. Gibt es eine Möglichkeit für mich festzustellen, ob die Zeichenfolge, die ich habe, vor der Konvertierung eine gültige ObjectID für Mongo ist?

Hier ist das Kaffeescript für meine aktuelle findByID-Funktion. Es funktioniert großartig, aber ich würde gerne nach einem anderen Attribut suchen, wenn ich feststelle, dass die Zeichenfolge keine ID ist.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404
53
Will

Ich habe festgestellt, dass der ObjectId-Validierer mongoose gültige objectIds validiert, aber ich habe einige Fälle gefunden, in denen ungültige IDs als gültig betrachtet wurden. (zB: beliebige 12 Zeichen lange Zeichenfolge)

var ObjectId = require('mongoose').Types.ObjectId;
ObjectId.isValid('Microsoft123'); //true
ObjectId.isValid('timtomtamted'); //true
ObjectId.isValid('551137c2f9e1fac808a5f572'); //true

Was für mich funktioniert hat, ist das Umwandeln einer Zeichenfolge in eine objectId und das Überprüfen, ob die ursprüngliche Zeichenfolge mit dem Zeichenfolgenwert der objectId übereinstimmt.

new ObjectId('timtamtomted'); //616273656e6365576f726b73
new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2

Dies funktioniert, da gültige IDs nicht geändert werden, wenn sie in eine ObjectId umgewandelt werden. Eine Zeichenfolge, die einen ungültigen Wert erhält, ändert sich jedoch, wenn sie in eine ObjectId umgewandelt wird.

72
Andy Macleod

Sie können einen regulären Ausdruck verwenden, um dies zu testen:

CoffeeScript

if id.match /^[0-9a-fA-F]{24}$/
    # it's an ObjectID
else
    # nope

JavaScript

if (id.match(/^[0-9a-fA-F]{24}$/)) {
    // it's an ObjectID    
} else {
    // nope    
}
63
JohnnyHK

Ich habe dazu in der Vergangenheit den nativen Knoten-Mongodb-Treiber verwendet. Die isValid-Methode überprüft, ob der Wert eine gültige BSON-ObjectId ist. Siehe die Dokumentation hier.

var ObjectID = require('mongodb').ObjectID;
console.log( ObjectID.isValid(12345) );
6
cbaigorri

Hier ist ein Code, den ich geschrieben habe, basierend auf der Antwort von @ andy-macleod.

Es kann entweder ein int oder einen String oder ObjectId annehmen und gibt ein gültiges ObjectId zurück, wenn der übergebene Wert gültig ist, oder null, wenn er ungültig ist:

var ObjectId= require('mongoose').Types.ObjectId;

function toObjectId(id) {

    var stringId = id.toString().toLowerCase();

    if (!ObjectId.isValid(stringId)) {
        return null;
    }

    var result = new ObjectId(stringId);
    if (result.toString() != stringId) {
        return null;
    }

    return result;
}
3
nzjoel

mongoose.Types.ObjectId.isValid (string) gibt immer True zurück, wenn der String 12 Buchstaben enthält 

let firstUserID = '5b360fdea392d731829ded18';
let secondUserID = 'aaaaaaaaaaaa';

console.log(mongoose.Types.ObjectId.isValid(firstUserID)); // true
console.log(mongoose.Types.ObjectId.isValid(secondUserID)); // true

let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");
console.log(checkForValidMongoDbID.test(firstUserID)); // true
console.log(checkForValidMongoDbID.test(secondUserID)); // false
0
Sajag Porwal

Verwenden Sie für Mungos die Funktion isValid (), um zu prüfen, ob objectId gültig ist oder nicht 

Beispiel:

var ObjectId = mongoose.Types.ObjectId;
if(ObjectId.isValid(req.params.documentId)){
   console.log('Object id is valid'); 
}else{
   console.log('Invalid Object id');
}
0
Om Sharma

Ich brauchte eine Weile, um eine gültige Lösung zu erhalten, da die von @Andy Macleod vorgeschlagene Lösung des Vergleichens des objectId-Werts mit seiner eigenen Zeichenfolge den Express.js-Server abstürzte: 

var view_task_id_temp=new mongodb.ObjectID("invalid_id_string"); //this crashed

Ich habe nur einen einfachen Try-Catch verwendet, um dieses Problem zu lösen.

var mongodb = require('mongodb');
var id_error=false;
try{
    var x=new mongodb.ObjectID("57d9a8b310b45a383a74df93");
    console.log("x="+JSON.stringify(x));
}catch(err){
    console.log("error="+err);
    id_error=true;
}

if(id_error==false){
   // Do stuff here
}
0
0112358

Wenn Sie den Hex-String haben, können Sie Folgendes verwenden:

ObjectId.isValid(ObjectId.createFromHexString(hexId));
0
pkarc

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, eine neue ObjectId mit dem Wert zu erstellen, den ich überprüfen möchte.

function validate(id) {
    var valid = false;
    try
    {
        if(id == new mongoose.Types.ObjectId(""+id))
           valid = true;

    }
    catch(e)
    {
       valid = false;
    }
    return valid;
}

> validate(null)
false
> validate(20)
false
> validate("abcdef")
false
> validate("5ad72b594c897c7c38b2bf71")
true
0
Daphoque

Der einfachste Weg besteht darin, Ihre ObjectId-Methode in einen Try-and-Catch-Dienst zu integrieren. Dann verwenden Sie diesen Dienst, um die Objekt-IDs zu verarbeiten, anstatt die Methode direkt zu verwenden:

var ObjectId = REQUIRE OR IMPORT ...

// service
function oid(str) {
 try {   
   return ObjectId(str);
 } catch(err) {
   return false;
 }
}

// usage
if (oid(USER_INPUT)) {
  // continue
} else {
  // throw error
}

Sie können auch null oder leere Requisiten senden, um eine neu generierte ID zu erhalten.

0
Raz