我认为我在node.js中了解异步调用时遇到了一些麻烦
在一个简单的API中,用户的GET路由将在数据库中查找并在回调中返回用户信息。
但是,我有一个路由中间件,它接收带有该调用的身份验证令牌,需要在我的数据库中找到相应的电子邮件以返回用户信息。
我写了一个函数,通过给定的令牌查找电子邮件并返回电子邮件地址。这个问题是(在做了一些研究之后)你不应该从异步调用返回信息,以避免运行需要你仍在等待的信息的代码。
对此的一个解决方案是将数据库查找移动到需要电子邮件的路由。这样做的缺点是我还有其他地方需要这样做才能让我重复代码,这是一个很重要的代码......
那么我应该使数据库查找同步吗?这有可能吗?这似乎只是一个脏的重复代码。
或者我应该在客户端保存用户电子邮件以通过电话发送它?这也似乎很糟糕,因为我想避免保存用户信息客户端。
我是否一起错过了解决方案?
我想听听你的想法!
简化我的情况:
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;
});
}
答案 0 :(得分:1)
您必须使用Promises
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);
});
});
}