Tengo el siguiente esquema (disculpas de que está en coffeescript)

Schema = mongoose.Schema

AuthS = new Schema
    auth:   {type: String, unique: true}
    nick:   String
    time:   Date
Auth = mongoose.model 'Auth', AuthS

Simplemente quiero recuperar un registro que sin duda está en mi base de datos:

Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });

Por desgracia esto siempre registra null. db.auths.findOne({nick: 'noname'}) en mongo shell siempre devuelve un valor. ¿Qué está pasando?

  • No hay necesidad de pedir disculpas por no estar en CoffeeScript; simplemente no la etiqueta con javascript.

5 Comentarios

  1. 79

    Encontrado el problema, necesita usar function(err,obj) lugar:

    Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
    • Cuando yo uso findOne como este puedo obtener mis datos correctamente pero obj no es un Document objeto. Cuando intento obj.nick y obj[nick] puedo obtener indefinido. Cuando intento obj.get('nick') puedo conseguir el objeto no tiene método get. He intentado muchas JSON conversiones y la creación de un doc = new Document(obj). También traté de doc.toObject(obj) y doc.set(obj);
    • Creo que si obj.toObject() que le dará lo que usted estaba buscando.
    • Cuando la operación se ejecuta correctamente (errar es nulo), pero no hay ninguna coincidencia, el documento será nulo también.
    • Pero, ¿cómo conseguir el objeto en el interior de findOne? Estoy suponiendo que esta información estaría en una ruta. req.el cuerpo?
    • Gracias. Pero por favor, hágamelo saber la razón. Sólo para un proyecto en el que estoy utilizando como este para que otros los puedo usar . símbolo
  2. 3

    Mangosta básicamente envuelve mongodb del api para darle un pseudo relacional db api para que las consultas no va a ser exactamente igual a consultas a mongodb. Mangosta findOne consulta devuelve un objeto de consulta, no es un documento. También se puede usar un callback como la solución sugiere o como de v4+ findOne devuelve un thenable así que usted puede utilizar .a continuación, o esperan/async para recuperar el documento.

    //thenables
    Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
    Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(doc)});
    
    //To use a full fledge promise you will need to use .exec()
    var auth = Auth.findOne({nick: 'noname'}).exec();
    auth.then(function (doc) {console.log(doc)});
    
    //async/await
    async function auth() {
      const doc = await Auth.findOne({nick: 'noname'}).exec();
      return doc;
    }
    auth();
    

    Ver el docs si desea utilizar una tercera parte de la promesa de la biblioteca.

  3. 2

    Usted puede ser que desee considerar el uso de console.log con el built-in «argumentos» objeto:

    console.log(arguments); //would have shown you [0] null, [1] yourResult

    Esta será siempre la salida de todos sus argumentos, no importa cómo muchos de los argumentos que usted tiene.

  4. 0

    En mi caso el mismo error , estoy usando Asyanc /Await funciones , para esto tiene que añadir ESPERAN para findOne

    Ex:const foundUser = User.findOne ({ "email" : req.body.email });

    arriba , foundUser siempre contiene el valor del Objeto en ambos casos, ya sea usuario o no porque es devolver valores antes de terminar findOne .

    const foundUser = await User.findOne ({ "email" : req.body.email });

    arriba , foundUser devuelve null si el usuario no existe en la colección, siempre y cuando cuenten con la condición . Si el usuario encuentra devuelve al usuario el documento.

Dejar respuesta

Please enter your comment!
Please enter your name here