理解node.js中的异步时遇到问题

理解node.js中的异步时遇到问题,node.js,mongodb,asynchronous,Node.js,Mongodb,Asynchronous,我想我在node.js中理解异步调用时遇到了一些麻烦 在一个简单的API中,用户的GET路由将在数据库中查找,并在回调中返回用户信息 但是,我有一个路由中间件,它通过调用接收auth令牌,并需要在我的数据库中找到相应的电子邮件以返回用户信息 我编写了一个函数,通过给定的令牌查找电子邮件并返回电子邮件地址。问题是(在做了一些研究之后)不应该从异步调用返回信息,以避免运行需要您仍在等待的信息的代码 一种解决方案是将数据库查找移动到需要电子邮件的路径。这样做的缺点是,我有其他地方需要这样做,这迫使我复

我想我在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);
        });

    });
}
你也应该阅读