Set Variable to result of Mongoose Find

The function User.find() is an asynchronous function, so you can't use a return value to get a resultant value. Instead, use a callback:

function retrieveUser(uname, callback) {
  User.find({uname: uname}, function(err, users) {
    if (err) {
      callback(err, null);
    } else {
      callback(null, users[0]);
    }
  });
};

The function would then be used like this:

retrieveUser(uname, function(err, user) {
  if (err) {
    console.log(err);
  }

  // do something with user
});


Updated on 25th Sept. 2019

Promise chaining can also be used for better readability:

Model
.findOne({})
.exec()
.then((result) => {
   // ... rest of the code
   return Model2.findOne({}).exec();
})
.then((resultOfModel2FindOne) => {
   // ... rest of the code
})
.catch((error) => {
   // ... error handling
});

I was looking for an answer to the same question.

Hopefully, MongooseJS has released v5.1.4 as of now.

Model.find({property: value}).exec() returns a promise.

it will resolve to an object if you use it in the following manner:

const findObject = (value) => {
  return Model.find({property: value}).exec();
}

mainFunction = async => {
     const object = await findObject(value);
     console.log(object); // or anything else as per your wish
}