在mongoose完成查询数据库之后返回一个函数

时间:2017-11-24 13:41:52

标签: javascript node.js asynchronous mongoose

修改

我设法做到了。我使用了很棒的异步模块。以下是解决方案:

async.each(req.body.users, function(userId, next) {
  User.count( { _id: userId } ).exec(function(err, count) {
    if(count === null) {
      next("Doesn't exist);
    } else {
      next();
    }
}, function(err) {
  if(err) {
    console.log(err);
  } else {
    console.log("success");
  }
});

问题

我的方案如下。我正在向db控制器发出post请求,以便在db中创建文档。该请求显然包含来自表单的数据,存储在req.body中。我想在将数据推送到数据库之前检查数据是否正确,我通过调用函数来检查数据。

其中一个字段是user._id的数组,我想检查所有这些字段是否属于用户。

我实现这个的方式如下:

req.body.users.forEach(function(userId) {
  User.count({ _id: userId }).exec(function(err, count) {
    if(count === 0) {
      return false;
    }
  }
}
return true;

基本上,我调用mongoose来计算db中有多少文档具有给定id,如果答案为零,则该字段不包含有效值,并且该函数返回false。否则,它应该返回true。

问题是对数据库的所有调用都是异步的,因此在检查所有用户的ID之前函数返回true。

我想过使用承诺,但我不知道从哪里开始。 有没有人有任何想法或建议?

提前致谢! 干杯。 :)

1 个答案:

答案 0 :(得分:0)

所以你要做的就是检查每个给定的idUser是否正常。

在我的示例中,我执行了一个请求,该请求将返回每个拥有req.body.users内部ID的用户。

最后,我检查我想检查的用户数是否与我获得数据的用户数相同。如果它不匹配,则意味着我们有一个不在数据库中的idUser。

  User.find({
      _id: {
        $in: req.body.users,
      },
    }, '_id')
    .then((rets) => {
      if (rets.length !== req.body.users.length) {
        //
        //  /!\ Unknown idUser
        // 

        throw new Error('...');
      }

      // All is alright
    })
    .catch((err) => {
      ...
    });

在我的示例中,我使用了Promise对象和projection