我有一个简单的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
函数返回?
答案 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);
});
};