È possibile determinare se una stringa è un MongoDB ObjectID?

Sto facendo MongoDB ricerche attraverso la conversione di una stringa di BSON. C’è un modo per me per determinare se la stringa che ho è un valido ObjectID per Mongo prima di fare la conversione?

Qui è il coffeescript per il mio attuale findByID funzione. Funziona alla grande, ma mi piacerebbe di ricerca da un diverso attributo di determinare se la stringa non è un ID.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404
  • Per ora, con un try catch block funziona. È questa la soluzione consigliata?
InformationsquelleAutor Will | 2012-12-13



11 Replies
  1. 97

    Ho trovato che la mongoose ObjectId validator a convalidare valido objectid, ma ho trovato un paio di casi in cui id non validi sono stati considerati validi. (ad esempio: ogni 12 caratteri stringa)

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

    Che ha lavorato per me è il getto di una stringa di un oggetto e poi verifica che la stringa originale corrisponde alla stringa il valore dell’oggetto.

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

    Questo lavoro perché gli identificativi validi non cambiano quando trasformati in un Oggetto, ma una stringa che si ottiene un falso valido cambierà quando trasformati in un oggetto.

    • Teoricamente si potrebbe aggiungere questi due metodi per generare una dannatamente buona ObjectID validator, otterrà che si fa oggi.
    • Quindi, qualcosa di simile a questo? function checkObjectIdValid(id){ if(ObjectID.isValid(id)){ if(new ObjectID(id) === id){ return true } else { return false } } else { return false } }
    • Qualcosa di simile che avrebbe funzionato, o per il confronto di stringhe utilizzando ObjetcId la funzione toString.
    • Ma se hai male di ingresso che non è 12 di lunghezza e contiene i tasti speciali? Riceverai un messaggio di errore con il tempo si farà ObjectId(INPUT). Penso sia meglio per avvolgere la convalida utilizzo di try e catch funzione.
  2. 67

    È possibile utilizzare un’espressione regolare per il test di che:

    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    
    }
    • Hmm questo potrebbe corrispondere non objectid così, il modo migliore è quello di costruire un validatore basato su specifiche e la regex è una parte specifica o provare a fare un nuovo objectid e la casa di un blocco catch per catturare se è in grado di farlo.
    • E ‘ lo stesso di convalida che è usato da BSON ObjectID costruttore. Mi puoi dare un esempio di un non-ObjectID stringa sarebbe partita?
    • Wow, non pensavo che in arrivo. Beh, ogni 24 stringa di caratteri che ha numeri e lettere, cioè lol456712bbfghLLsdfr
    • L’espressione regolare corrisponde solo alfa caratteri a-f e-F in modo che la stringa non corrisponde.
    • Beh, ok, forse ho scritto un po ‘ velocemente, quindi: 456546576541232123adcdeA sarebbe poi partita
    • Ma questo è un valido ObjectID, quindi dovrebbe corrispondere.
    • vedere i commenti qui per quanto riguarda la stessa
    • Probabilmente il modo giusto, ufficialmente suggerito da mongoose github.com/Automattic/mongoose/issues/…
    • Questo dovrebbe essere accettato risposta, questo è ciò che è ufficialmente suggerito dai ragazzi di mangusta.

  3. 8

    Ho usato il nativo nodo mongodb driver per fare questo in passato. Il metodo isValid controlla che il valore è un valido BSON ObjectId. Vedere la documentazione qui.

    var ObjectID = require('mongodb').ObjectID;
    console.log( ObjectID.isValid(12345) );
    • non sembra funzionare, sopra restituisce true per un numero casuale.
    • Penso che la più probabile, perché dovrebbe essere ObjectId, non ObjectID. 🙂
  4. 3

    Qui è una parte di codice che ho scritto, basato su @andy-macleod risposta.

    Si può prendere un int o una stringa o un Oggetto e restituisce un valido ObjectId se il valore passato è valido o null se non è valido:

    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;
    }
  5. 1

    mangusta.Tipi di.ObjectId.isValid(stringa) restituisce sempre True se la stringa contiene 12 lettere

    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
  6. 0

    Se hai la stringa esadecimale è possibile utilizzare questo:

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

    Mi ci è voluto un po ‘ per ottenere una valida soluzione come quella proposta da @Andy Macleod di confronto objectId valore con la propria stringa che andava in crash il Express.js server:

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

    Ho solo usato un semplice try catch per risolvere questo problema.

    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
    }
  8. 0

    Per mongoose , Utilizzare isValid() funzione per verificare se objectId è valido o non

    Esempio :

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

    L’unico modo che ho trovato è quello di creare un nuovo Oggetto con il valore che si desidera controllare, se l’input è pari alla produzione, l’id è valido :

    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
  10. 0

    Il modo più semplice è fondamentalmente avvolgere il vostro ObjectId metodo in un try e catch servizio.
    Quindi si utilizza questo servizio per gestire Objecet Id, invece di utilizzare il metodo diretto:

    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
    }

    È anche possibile inviare null o vuoto puntelli per ottenere un nuovo ID generato.

  11. -1

    Attenzione: isValid tornerà vero arbitrario 12/24 lunghezza stringhe che iniziano con un valido cifra esadecimale.
    Attualmente credo che questo sia un migliore controllo:

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

    • Questo dovrebbe restituire true per 'funky string'. Qualsiasi stringa della lunghezza giusta e inizia con una cifra esadecimale in grado di soddisfarlo.

Lascia un commento