6

我正在尝试做这样的事情

    function retrieveUser(uname) {
      var user = User.find({uname: uname}, function(err, users) {
        if(err)
          console.log(err);
          return null;
        else
          return users[0];
      return user;

但这会返回一个文档而不是一个用户对象。参数 users 是与查询匹配的用户对象数组,那么我如何将其中一个对象存储到我的函数可以返回的变量中?

4

3 回答 3

21

该函数User.find()是一个异步函数,因此您不能使用返回值来获取结果值。相反,使用回调:

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

然后将像这样使用该函数:

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

  // do something with user
});
于 2013-09-21T22:52:55.960 回答
4

更新于 2019 年 9 月 25 日

Promise 链也可以用于更好的可读性:

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

我一直在寻找同一个问题的答案。

希望 MongooseJS 目前已经发布了 v5.1.4。

Model.find({property: value}).exec()返回一个承诺。

如果您以下列方式使用它,它将解析为一个对象:

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
}
于 2018-06-06T13:00:25.900 回答
2

基本上,MongoDB 和 NodeJS 具有异步功能,因此我们必须使其成为同步功能,然后才能按预期正常工作。

router.get('/', async function(req, res, next) {

  var users = new mdl_users();
      var userData = []; // Created Empty Array
      await mdl_users.find({}, function(err, data) {
        data.forEach(function(value) {
          userData.push(value);
        });
      });
  res.send(userData);

});

在示例中,mdl_users 是猫鼬模型,我有一个用户集合(表)用于 MongoDB 数据库中的用户数据,并且数据存储在“userData”变量中以显示它。在这个查找函数中,我将所有文档(表的行)拆分为如果您只想要所有记录,请使用以下代码直接使用 find() 函数。

router.get('/', async function(req, res, next) {

  var users = new mdl_users();
  var userData = await mdl_users.find();
  res.send(userData);

});
于 2018-10-24T17:06:56.773 回答