【问题标题】:Node/Mongoose model creation executing before declaration assignment在声明分配之前执行节点/猫鼬模型创建
【发布时间】:2015-08-04 14:58:33
【问题描述】:

Facebook.create 在 fbUtils.getLongTermToken 完成检索长期令牌之前执行。这会在尝试创建用户时导致验证问题。我是否需要使用 Promise 来管理这里发生的异步执行?

var userData = req.body;
userData.email = userData.email.toLowerCase();
userData.fbAuthToken = fbUtils.getLongTermToken(userData.fbAuthToken);

FacebookUser.create(userData, function (err, fbUser) {
    console.log(userData.fbAuthToken);
    if (err) {
        console.log(err.message);
        if (err.toString().indexOf('E11000') > -1) {
            err = new Error('Email already exists.');
        }
        res.status(400);
        return res.sendStatus({reason: err.toString()});
    } else {
        res.send('success');
    }
});

这是 fbUtils.getLongTermToken 的代码:

getLongTermToken: function (token) {
    var options = {
        host: 'graph.facebook.com',
        path: '/oauth/access_token?grant_type=fb_exchange_token'
        + '&client_id=' + CONSTANTS.FACEBOOK_APP_ID
        + '&client_secret=' + CONSTANTS.FACEBOOK_APP_SECRET
        + '&fb_exchange_token=' + token
    };
    var str = '';
    http.get(options, function (res) {

        res.on('data', function (chunk) {
            str += chunk;
        });

        res.on('end', function () {
            console.log(str);
            console.log(fbUtils.parseToken(str));
            return fbUtils.parseToken(str);
        });
    }).on('error', function(err) {
        console.log('longterm error: ' + err.message);
    });
    return str;

}

【问题讨论】:

  • 因为fbUtils.getLongTermToken 是异步的,所以应该在其回调中调用Facebook.create

标签: node.js asynchronous mongoose


【解决方案1】:

您还需要更新 getLongTermToken 以获取回调,该回调将在令牌检索完成时调用。例如:

getLongTermToken: function (token, cb) {
    var options = {
        host: 'graph.facebook.com',
        path: '/oauth/access_token?grant_type=fb_exchange_token'
        + '&client_id=' + CONSTANTS.FACEBOOK_APP_ID
        + '&client_secret=' + CONSTANTS.FACEBOOK_APP_SECRET
        + '&fb_exchange_token=' + token
    };
    var str = '';
    http.get(options, function (res) {

      res.on('data', function (chunk) {
        str += chunk;
      });

      res.on('end', function () {
        console.log(str);
        console.log(fbUtils.parseToken(str));
        return cb(fbUtils.parseToken(str));
      });
    }).on('error', function(err) {
        console.log('longterm error: ' + err.message);
    });
}

那么你需要更新你的调用代码来等待这个令牌:

var userData = req.body;
userData.email = userData.email.toLowerCase();
fbUtils.getLongTermToken(userData.fbAuthToken, function (token) {
    userData.fbAuthToken = token;
    FacebookUser.create(userData, function (err, fbUser) {
        console.log(userData.fbAuthToken);
        if (err) {
            console.log(err.message);
            if (err.toString().indexOf('E11000') > -1) {
                err = new Error('Email already exists.');
            }
            res.status(400);
            return res.sendStatus({reason: err.toString()});
        } else {
            res.send('success');
        }
    });
});

【讨论】:

  • 完美。谢谢先生。
【解决方案2】:

因为fbUtils.getLongTermToken 是异步的,所以在检索和解析令牌后,应在其回调中调用Facebook.create

getLongTermToken: function (token) {
    var options = {
        host: 'graph.facebook.com',
        path: '/oauth/access_token?grant_type=fb_exchange_token'
        + '&client_id=' + CONSTANTS.FACEBOOK_APP_ID
        + '&client_secret=' + CONSTANTS.FACEBOOK_APP_SECRET
        + '&fb_exchange_token=' + token
    };
    var str = '';

    http.get(options, function (res) {

        res.on('data', function (chunk) {
            str += chunk;
        });

        res.on('end', function () {
            console.log(str);
            console.log(fbUtils.parseToken(str));
            var parsedToken = fbUtils.parseToken(str);

            // The earliest point where the token can be used
            Facebook.create(...);

            return parsedToken;
        });
    }).on('error', function(err) {
        console.log('longterm error: ' + err.message);
    });
    return str;

}

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 2019-07-01
    • 2015-06-20
    • 2012-04-22
    • 2017-05-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多