模型上的mongoose findOne是否会返回一个承诺?

时间:2016-02-26 21:36:32

标签: mongodb mongoose

我有一个简单的Node模块,可以导出一个进行数据库查询的函数。问题是此函数在数据库查询完成之前返回。

"use strict";

var mongoose = require('mongoose'),
    Model    = require('./entities/user/model'),
    _        = require('underscore');

let dao = new Model(mongoose);

module.exports.isAdmin = function(user_id) {
  var params = {'roles': 'admin'};

  dao.findOne(params, function(err, user) {
    if (err) {
      logger.error(err);
      return false;
    }
    if (_.indexOf(user.roles, 'admin') != -1) {
      logger.info("admin user: " + user._id);
      if (user._id == user_id) return true;
    }
    return false;
  });
};

isAdmin函数搜索用户集合,以查明user_id是否属于管理员用户。

问题是isAdmin函数不等待findOne查询的响应。

如果查询返回结果,我怎么能强制isAdmin函数返回?

1 个答案:

答案 0 :(得分:8)

因为findOne async 函数,从中返回的一种方法是通过callback函数

module.exports.isAdmin = function(user_id, callback) {
  var params = {'roles': 'admin'};

  dao.findOne(params, function(err, user) {
    if (err) {
      logger.error(err);
      callback && callback(false);
    }
    if (_.indexOf(user.roles, 'admin') != -1) {
      logger.info("admin user: " + user._id);
      if (user._id == user_id)
          callback && callback(true);
    }
    callback && callback(true);
  });
};

isAdmin(userId, function(v) {
    console.log(v);
})

另一种方法是在findOne中获取Promise,正如此文档所说,.exec()为您提供了一个完全成熟的承诺。即使使用Promise,为了满足您的要求,结果也可以通过回调函数返回。

module.exports.isAdmin = function(user_id, callback) {
  var params = {'roles': 'admin'};

  var queryPromise = dao.findOne(params).exec();
  queryPromise.then(function(user) {
      if (_.indexOf(user.roles, 'admin') != -1) {
        logger.info("admin user: " + user._id);
        if (user._id == user_id)
          callback && callback(true);
      }
    }, function(err) {
      callback && callback(false);
  });
};