我有一个简单的 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
函数仅在查询返回结果时返回?
因为
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);
});
};
关于 因为 findOne 是异步函数,所以从它返回的一种方法是通过回调函数。从版本7开始,mongoose不支持FindOne中的回调,它必须像promise一样使用。