Node.js 如何等待承诺完成?

Node.js 如何等待承诺完成?,node.js,express,spotify,Node.js,Express,Spotify,我正在使用它来进行api调用 我的问题是在GetMeAPI调用返回数据之前我被重定向了 如何等待结果然后重定向 对不起,我是NodeJS和Express的新手 var express = require('express'); var router = express.Router(); /* GET callback. */ router.get('/', function(req, res, next) { console.log('callback worked!')

我正在使用它来进行api调用

我的问题是在GetMeAPI调用返回数据之前我被重定向了

如何等待结果然后重定向

对不起,我是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;

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

var express=require('express');
var router=express.router();
/*回拨电话*/
router.get('/',函数(req,res,next){
console.log('callback worked!')
var代码=req.query.code | | null;
//var state=req.query.state | | null;
//var storedState=req.cookies?req.cookies[stateKey]:空;
请求应用程序设置spotifyApi授权代码授权(代码)
.then(功能(数据){
log('令牌在'+data.body['expires_in']中过期]);
log('访问令牌是'+data.body['access_token']);
log('刷新令牌为'+data.body['refresh_-token']);
//在API对象上设置访问令牌,以便在以后的调用中使用它
requ.app.settings.spotifyApi.setAccessToken(data.body['access_token']);
requ.app.settings.spotifyApi.setRefreshToken(data.body['refresh_token']);
返回req.app.settings.spotifyApi.getMe().then(函数(数据){
if(typeof req.session.user==‘未定义’){
req.session.user={};
}
//永远不会到这里
控制台日志(请求会话用户);
req.session.user.display\u name=data.body.display\u name
req.session.user.email=data.body.email
req.session.user.id=data.body.id
},函数(err){
log('出了问题!',err);
});
},函数(err){
log('出了问题!',err);
})
.然后(()=>{
res.redirect(302,“/”);
})
});

module.exports=路由器如果在出错或成功后需要重定向作为最后一步,请尝试以下解决方案:

var express=require('express');
var router=express.router();
/*回拨电话*/
router.get('/',函数(req,res,next){
console.log('callback worked!')
var代码=req.query.code | | null;
//var state=req.query.state | | null;
//var storedState=req.cookies?req.cookies[stateKey]:空;
请求应用程序设置spotifyApi授权代码授权(代码)
.then(功能(数据){
log('令牌在'+data.body['expires_in']中过期]);
log('访问令牌是'+data.body['access_token']);
log('刷新令牌为'+data.body['refresh_-token']);
//在API对象上设置访问令牌,以便在以后的调用中使用它
requ.app.settings.spotifyApi.setAccessToken(data.body['access_token']);
requ.app.settings.spotifyApi.setRefreshToken(data.body['refresh_token']);
返回req.app.settings.spotifyApi.getMe().then(函数(数据){
if(typeof req.session.user==‘未定义’){
req.session.user={};
}
//永远不会到这里
控制台日志(请求会话用户);
req.session.user.display\u name=data.body.display\u name
req.session.user.email=data.body.email
req.session.user.id=data.body.id
},函数(err){
log('出了问题!',err);
});
},函数(err){
log('出了问题!',err);
})
.然后(()=>{
res.redirect(302,“/”);
})
});
module.exports=路由器谢谢

这是我的工作代码:

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;
谢谢

这是我的工作代码:

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;

它首先重定向,因为res.redirect在回调之外。将res.redirect放在getMe()的内部,然后(…)放在最后一个函数后面,或者在最后一个函数(err)后面放另一个.then(),然后在其中执行res.redirect(),因为res.redirect在回调之外,所以是先重定向的。将res.redirect放在getMe()中。然后(…)放在最后一个函数后面,或者在最后一个函数(err)后面放另一个.then()并在其中执行res.redirect()