Estoy haciendo MongoDB búsquedas mediante la conversión de una cadena a HIJO. Hay una manera para mí para determinar si la cadena que tengo es válido ObjectID para Mongo antes de hacer la conversión?

Aquí es el coffeescript para mi actual findByID función. Funciona muy bien, pero me gustaría búsqueda por un atributo diferente si puedo determinar que la cadena no es 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
  • Por ahora, el uso de un try catch block funciona. Es esta la solución recomendada?
InformationsquelleAutor Will | 2012-12-13

11 Comentarios

  1. 97

    Me encontré con que la mangosta ObjectId validador de obras para validar válido objectIds pero he encontrado un par de casos donde no válido id se considera válido. (por ejemplo: 12 caracteres de longitud de cadena)

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

    Lo que ha estado trabajando para mí es convertir una cadena a un id de objeto y, a continuación, comprobar que la cadena original coincide con la cadena de valor de la objectId.

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

    Este trabajo porque válido id no cambian cuando arrojó a un ObjectId pero una cadena que consigue una falsa válido cambiará cuando arrojó a un objectId.

    • Teóricamente, se podría agregar que estos dos métodos para generar una muy buena ObjectID validador, tendrá que hacer el día de hoy.
    • Así, algo como esto? function checkObjectIdValid(id){ if(ObjectID.isValid(id)){ if(new ObjectID(id) === id){ return true } else { return false } } else { return false } }
    • Algo así como que iba a trabajar, o a la comparación de cadenas utilizando ObjetcId la función toString.
    • Pero si usted tiene mal de entrada que no es del 12 de longitud y contiene las teclas especiales? Obtendrá un error por el tiempo que va a hacer ObjectId(INPUT). Yo creo que mejor para envolver la validación mediante el try y catch función.
  2. 67

    Puede utilizar una expresión regular para probar que:

    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 esto podría coincidir no objectIds así, la mejor manera es la de construir un validador basado en la especificación y regex es específico de partes o tratar de hacer una nueva id de objeto y de la casa de un bloque catch para capturar, si es que puede hacerlo.
    • Es el mismo de validación que se utiliza por la HIJO ObjectID constructor. Me puede dar un ejemplo de no-ObjectID de la cadena sería el partido?
    • Wow, yo no lo vi venir. Bueno, cada 24 cadena de caracteres que contiene los números y las letras, es decir, lol456712bbfghLLsdfr
    • La expresión regular que sólo los partidos alfa caracteres de la a a la f y-F, de modo que la cadena no coinciden.
    • Ok bien tal vez me escribió que un poco rápido, así que: 456546576541232123adcdeA sería entonces partido
    • Pero eso es válido ObjectID, por lo que debe coincidir.
    • ver comentarios aquí con respecto a la misma
    • Probablemente la manera correcta, oficialmente sugerido por la mangosta github.com/Automattic/mongoose/issues/…
    • Esto debe ser aceptado respuesta, esto es lo que oficialmente se sugirió por parte de la gente de la mangosta.

  3. 8

    He utilizado el nativo nodo mongodb conductor para hacer esto en el pasado. El método isValid comprueba que el valor es válido HIJO ObjectId. Consulte la documentación aquí.

    var ObjectID = require('mongodb').ObjectID;
    console.log( ObjectID.isValid(12345) );
    • parece que no funciona, por encima devuelve true para un número aleatorio.
    • Creo que es más probable, ya que debe ser ObjectId, no ObjectID. 🙂
  4. 3

    Aquí está el código que he escrito basado en @andy-macleod la respuesta.

    Puede tomar un int o string o id de objeto y devuelve un válido ObjectId si el valor pasado es válido o nulo si es inválido:

    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

    mangosta.Tipos.ObjectId.isValid(cadena) siempre devuelve True si la cadena contiene 12 letras

    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

    Si usted tiene la cadena hexadecimal puede utilizar este:

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

    Me tomó un tiempo para conseguir una solución válida como la propuesta por @Andy Macleod de comparar el valor de objectId con su propia cadena se bloquea el Express.js servidor:

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

    Acabo de utilizar un simple try catch para resolver esto.

    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

    Para la mangosta , el Uso de isValid() función para comprobar si objectId es válido o no

    Ejemplo :

    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

    La única manera que he encontrado es crear un nuevo id de objeto con el valor que desea comprobar si la entrada es igual a la de salida, el identificador es válido :

    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

    La forma más fácil es, básicamente, envolver el ObjectId método en un try y catch servicio.
    A continuación, utiliza este servicio para manejar Objecet de Id, en lugar de utilizar el método directamente:

    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
    }

    También puede enviar nulo o vacío accesorios para obtener un nuevo ID generado.

  11. -1

    Advertencia: isValid volverá verdadero arbitrarias de 12/24 longitud de las cadenas que comienzan con un dígito hexadecimal válido.
    Actualmente creo que esta es una mejor verificación:

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

    • Esto permitiría evaluar a true para 'funky string'. Cualquier cadena de caracteres que el derecho de longitud y comienza con un dígito hexadecimal se satisfacen.

Dejar respuesta

Please enter your comment!
Please enter your name here