理解node.js中的异步时遇到问题
我想我在node.js中理解异步调用时遇到了一些麻烦 在一个简单的API中,用户的GET路由将在数据库中查找,并在回调中返回用户信息 但是,我有一个路由中间件,它通过调用接收auth令牌,并需要在我的数据库中找到相应的电子邮件以返回用户信息 我编写了一个函数,通过给定的令牌查找电子邮件并返回电子邮件地址。问题是(在做了一些研究之后)不应该从异步调用返回信息,以避免运行需要您仍在等待的信息的代码 一种解决方案是将数据库查找移动到需要电子邮件的路径。这样做的缺点是,我有其他地方需要这样做,这迫使我复制代码,这是一个大禁忌 那么,我应该使数据库查找同步吗?这可能吗?这似乎只是一个肮脏的重复代码 或者我应该将用户电子邮件保存在客户端,以便与呼叫一起发送?这看起来也很糟糕,因为我想避免在客户端保存用户信息 我错过了所有的解决方案吗 我想听听你的想法 简化我的处境:理解node.js中的异步时遇到问题,node.js,mongodb,asynchronous,Node.js,Mongodb,Asynchronous,我想我在node.js中理解异步调用时遇到了一些麻烦 在一个简单的API中,用户的GET路由将在数据库中查找,并在回调中返回用户信息 但是,我有一个路由中间件,它通过调用接收auth令牌,并需要在我的数据库中找到相应的电子邮件以返回用户信息 我编写了一个函数,通过给定的令牌查找电子邮件并返回电子邮件地址。问题是(在做了一些研究之后)不应该从异步调用返回信息,以避免运行需要您仍在等待的信息的代码 一种解决方案是将数据库查找移动到需要电子邮件的路径。这样做的缺点是,我有其他地方需要这样做,这迫使我复
router.route('/firstroute/:token')
.get(function(req, res) {
var email = getEmail(req.params.token);
// find and send back user info
})
router.route('/someotherroute/:token')
.get(function(req, res) {
// I also need the email lookup here..
var email = getEmail(req.params.token);
})
getEmail: function(token) {
// look in session database for email belonging to this token
User.findOne({'token': token}, function (err, session) {
// check for err
return session.email;
});
}
您必须使用
承诺
router.route('/firstroute/:token')
.get(function (req, res) {
getEmail(req.params.token)
.then((email) => {
res.send({ email });
// find and send back user info
});
})
router.route('/someotherroute/:token')
.get(function (req, res) {
// I also need the email lookup here..
getEmail(req.params.token)
.then((email) => {
res.send({ email });
});
})
var getEmail = function (token) {
// look in session database for email belonging to this token
return new Promise((resolve, reject) => {
User.findOne({ 'token': token }, function (err, session) {
// check for err
if (err) {
return reject(err);
}
resolve(session.email);
});
});
}
你也应该阅读