2012-12-13 10 views
40

Robię wyszukiwania MongoDB, konwertując ciąg do BSON. Czy istnieje sposób dla mnie, aby ustalić, czy ciąg znaków, który mam, jest poprawnym ObjectIDem dla Mongo przed wykonaniem konwersji?Czy mogę określić, czy ciąg znaków jest identyfikatorem obiektu MongoDB?

Oto coffcesscript dla mojej aktualnej funkcji findByID. Działa wspaniale, ale chciałbym sprawdzić inny atrybut, jeśli stwierdzę, że ciąg nie jest identyfikatorem.

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

Na razie korzystania spróbować połowów prace blokowe. Czy to zalecane rozwiązanie? – Will

Odpowiedz

42

okazało się, że weryfikator mangusta ObjectId pracuje, aby potwierdzić prawidłowe objectIds ale znalazłem kilka przypadków, w których nieprawidłowe identyfikatory zostały uznane za ważne. (Np: dowolny ciąg 12 znaków)

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

Co działa na mnie rzuca ciąg do objectID a następnie sprawdzenie, czy oryginalny ciąg odpowiada wartości ciąg znaków objectID.

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

Prace dlatego ważne identyfikatory nie zmieniają się podczas lanego do objectID ale ciąg znaków, który staje się fałszywy ważny zmieni gdy lanego do objectID.

+0

Dobra, najlepsza odpowiedź znaleziona do tej pory na SO. – Antoine

+0

Teoretycznie możesz dodać te dwie metody do generowania całkiem cholernie dobrego walidatora ObjectID, zrobi to dzisiaj. – Antoine

56

Można użyć wyrażenia regularnego do testowania, że:

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  
} 
+0

Hmm, to może również pasować do obiektów nieobiektowych, najlepiej jest zbudować walidator na podstawie specyfikacji i wyreperować jego części lub spróbować zrobić nowy objectid i umieścić blok catch do złapania, jeśli może to zrobić. – Sammaye

+2

@Sammaye To ta sama weryfikacja, która jest używana przez [BSON ObjectID constructor] (https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js#L15). Czy możesz podać przykładowy ciąg niezgodny z identyfikatorem ObjectID? – JohnnyHK

+0

Wow, nie widziałem, że nadchodzi. Cóż, każdy 24-znakowy ciąg zawierający liczby i litery, tj. 'Lol456712bbfghLLsdfr' – Sammaye

5

Użyłem natywny sterownik węzeł MongoDB to zrobić w przeszłość. Metoda isValid sprawdza, czy ta wartość jest poprawnym identyfikatorem obiektu BSON. See the documentation here.

var ObjectID = require('mongodb').ObjectID; 
console.log(ObjectID.isValid(12345)); 
+0

wydaje się nie działać, powyżej zwraca true dla losowej liczby. –

-1

Ostrzeżenie: isValid powróci prawdziwą dla dowolnych 12/24 długość ciągów rozpoczynających się od ważnego cyfry hex. Obecnie myślę, że to jest lepsza kontrola:

((thing.length === 24 || thing.length === 12) && isNaN(parseInt(thing,16)) !== true)

+1

Oznaczałoby to "true" dla ''funky string''. Dowolny łańcuch o odpowiedniej długości i rozpoczynający się od cyfry szesnastkowej go zadowoli. – JohnnyHK

1

Oto kod, który napisałem na podstawie odpowiedzi @ andy-macleod.

Można wziąć albo int lub ciąg lub objectID i zwraca poprawny objectID jeśli przekazany wartość jest ważna lub null, jeśli jest nieprawidłowy:

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

Jeśli masz ciąg szesnastkowy można użyć to:

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

zajęło mi trochę czasu, aby uzyskać poprawny rozwiązanie jak zaproponowana przez @Andy Macleod porównywania wartości objectID z własnych strun awarii serwera Express.js na:

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

Po prostu użyłem prostej próby, aby rozwiązać ten problem.

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

Dla mangusta, funkcja Zastosowanie isValid(), aby sprawdzić, czy objectID jest ważny lub nie

Przykład:

var ObjectId = mongoose.Types.ObjectId; 
if(ObjectId.isValid(req.params.documentId)){ 
    console.log('Object id is valid'); 
}else{ 
    console.log('Invalid Object id'); 
} 
Powiązane problemy