模型上的猫鼬 findOne 是否返回承诺?

问题描述 投票:0回答:2

我有一个简单的 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
函数仅在查询返回结果时返回?

mongodb mongoose
2个回答
14
投票

因为

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);
  });
};

0
投票

关于 因为 findOne 是异步函数,所以从它返回的一种方法是通过回调函数。从版本7开始,mongoose不支持FindOne中的回调,它必须像promise一样使用。

© www.soinside.com 2019 - 2024. All rights reserved.