【问题标题】:How to wait for promise to complete?如何等待promise完成?
【发布时间】:2018-02-19 21:33:05
【问题描述】:

我正在使用Spotify Web Api Node 进行 api 调用。

我的问题是我在 getMe api 调用返回数据之前被重定向...

如何等待结果然后重定向?

抱歉,我是 NodeJS 和 Express 的新手。

var express = require('express');
var router = express.Router();

/* GET callback. */
router.get('/', function(req, res, next) {

    console.log('callback worked!')
    var code = req.query.code || null;
    // var state = req.query.state || null;
    // var storedState = req.cookies ? req.cookies[stateKey] : null;


    req.app.settings.spotifyApi.authorizationCodeGrant(code)
        .then(function(data) {
            console.log('The token expires in ' + data.body['expires_in']);
            console.log('The access token is ' + data.body['access_token']);
            console.log('The refresh token is ' + data.body['refresh_token']);

            // Set the access token on the API object to use it in later calls
            req.app.settings.spotifyApi.setAccessToken(data.body['access_token']);
            req.app.settings.spotifyApi.setRefreshToken(data.body['refresh_token']);

            req.app.settings.spotifyApi.getMe().then(function(data) {

                if (typeof req.session.user === 'undefined') {
                    req.session.user = {};
                }

                // never gets here
                console.log(req.session.user);

                req.session.user.display_name = data.body.display_name
                req.session.user.email = data.body.email
                req.session.user.id = data.body.id
            }, function(err) {
                console.log('Something went wrong!', err);
            });

        }, function(err) {
            console.log('Something went wrong!', err);
        });

    res.redirect(302, '/');
});

module.exports = router;

【问题讨论】:

  • 它首先重定向,因为您的 res.redirect 在您的回调之外。把你的 res.redirect 放在你的 getMe().then(...) 的最后,或者在你的最后一个函数(err)之后放另一个 .then() 并在那里做 res.redirect()

标签: node.js express spotify


【解决方案1】:

如果您在错误或成功后需要重定向作为最后一步,请尝试以下解决方案:

var express = require('express');
var router = express.Router();

/* GET callback. */
router.get('/', function(req, res, next) {

    console.log('callback worked!')
    var code = req.query.code || null;
    // var state = req.query.state || null;
    // var storedState = req.cookies ? req.cookies[stateKey] : null;


    req.app.settings.spotifyApi.authorizationCodeGrant(code)
        .then(function(data) {
            console.log('The token expires in ' + data.body['expires_in']);
            console.log('The access token is ' + data.body['access_token']);
            console.log('The refresh token is ' + data.body['refresh_token']);

            // Set the access token on the API object to use it in later calls
            req.app.settings.spotifyApi.setAccessToken(data.body['access_token']);
            req.app.settings.spotifyApi.setRefreshToken(data.body['refresh_token']);

            return req.app.settings.spotifyApi.getMe().then(function(data) {

                if (typeof req.session.user === 'undefined') {
                    req.session.user = {};
                }

                // never gets here
                console.log(req.session.user);

                req.session.user.display_name = data.body.display_name
                req.session.user.email = data.body.email
                req.session.user.id = data.body.id
            }, function(err) {
                console.log('Something went wrong!', err);
            });

        }, function(err) {
            console.log('Something went wrong!', err);
        })
        .then(() => {
          res.redirect(302, '/');  
        })
});

module.exports = router;

【讨论】:

    【解决方案2】:

    谢谢,

    这是我的工作代码:

    var express = require('express');
    var router = express.Router();
    
    /* GET callback. */
    router.get('/', function(req, res, next) {
    
        console.log('callback worked!')
        var code = req.query.code || null;
        // var state = req.query.state || null;
        // var storedState = req.cookies ? req.cookies[stateKey] : null;
    
    
        req.app.settings.spotifyApi.authorizationCodeGrant(code)
            .then(function(data) {
                console.log('The token expires in ' + data.body['expires_in']);
                console.log('The access token is ' + data.body['access_token']);
                console.log('The refresh token is ' + data.body['refresh_token']);
    
                // Set the access token on the API object to use it in later calls
                req.app.settings.spotifyApi.setAccessToken(data.body['access_token']);
                req.app.settings.spotifyApi.setRefreshToken(data.body['refresh_token']);
    
    
            }, function(err) {
                console.log('Something went wrong!', err);
            })
            .then(function(data) {
    
                req.app.settings.spotifyApi.getMe().then(function(data) {
    
                    req.session.user.display_name = data.body.display_name
                    req.session.user.email = data.body.email
                    req.session.user.id = data.body.id
    
                    console.log(req.session.user);
                    res.redirect(302, '/');
    
                }, function(err) {
                    console.log('Something went wrong!', err);
                    res.redirect(302, '/');
                });
    
            });
    
    });
    
    module.exports = router;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2016-12-18
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2019-03-31
      • 2018-07-17
      相关资源
      最近更新 更多