无法理解node.js

时间:2017-09-25 09:11:35

标签: node.js mongodb asynchronous

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

1 个答案:

答案 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);
        });

    });
}

您还应该阅读https://spring.io/understanding/javascript-promises