首页 > 解决方案 > 使用 Express 完成后端功能后重定向

问题描述

最近我一直在尝试使用快速网络服务器来构建一个可以使用 Discord 的 OAuth2 API 登录的网站。出于安全目的,我一直在使用 npm 模块 express-session 在会话中存储敏感信息,但是在这样做之后重定向时遇到了麻烦。我遇到的问题是代码将完成,甚至会发出重定向请求(我可以看到 GET 请求被记录),但客户端 Web 浏览器没有移动。希望有人能够帮助我了解原因,我相信这可能与重定向请求未发送给客户端有关,但我不完全确定如何将其发送给客户端。我在下面包括了相关的路线。

router.get('/callback', function(req,res) {
    logDate(req)
    res.render('callback')
});

router.post('/callback', bodyParser.json(), function(req,res) {
    logDate(req)
    ssn = req.session
    var originalUrl = req.body.location
    token = originalUrl.substring(originalUrl.indexOf("&") + 1);
    token = token.substring(0, token.indexOf('&'));
    token = token.replace('access_token=','');
    ssn.token = token
    res.redirect('/login');
});

router.get('/login', function(req,res) {
    logDate(req)
    ssn = req.session
    var ssnToken = `Bearer ${ssn.token}`
    function login(data, callback) {
        axios.defaults.headers.common['Authorization'] = ssnToken
        axios.get('https://discordapp.com/api/users/@me')
            .then(response => {
                ssn.login = "true"
                ssn.username = response.data.username
                ssn.discriminator = response.data.discriminator
                ssn.userid = response.data.id
                if (response.data.avatar) {
                    ssn.avatar = response.data.avatar
                    if (response.data.avatar.startsWith("a_")) {
                        ssn.pfp = `https://cdn.discordapp.com/avatars/${ssn.userid}/${ssn.avatar}.gif`
                    }
                    else {
                        ssn.pfp = `https://cdn.discordapp.com/avatars/${ssn.userid}/${ssn.avatar}.png`
                    }
                }
                else {
                    ssn.pfp = `https://cdn.discordapp.com/embed/avatars/${ssn.discriminator % 5}.png`
                } 
                callback(data)
            })
            .catch(error => {
                console.log(error);
            });
    }
    login("hhhh", (result) => {
        console.log(result)
        console.log(ssn.login)
        console.log(ssn.username)
        console.log(ssn.discriminator)
        console.log(ssn.userid)
        if (ssn.avatar) {
            console.log(ssn.avatar)
        }
        console.log(ssn.pfp)
        res.redirect(‘/dashboard’)
        
    });
});

顺便说一句,当“回调”被渲染时,POST 请求被发送到 /callback。它由客户端通过 XMLHttpRequest 发送。我指的重定向是代码块中显示的最后一个。感谢您花时间阅读我的第一个问题。

谢谢, 里斯

标签: javascriptnode.jsexpress

解决方案


EcmaScript 6您可以使用async / await关键字。因此,与其使用回调,不如将代码转换为async / await如下形式:

router.get('/login', async (req, res) => {
    logDate(req)
    ssn = req.session
    var ssnToken = `Bearer ${ssn.token}`

    try {
        axios.defaults.headers.common['Authorization'] = ssnToken
        const response = await axios.get('https://discordapp.com/api/users/@me')
        
        ssn.login = "true"
        ssn.username = response.data.username
        ssn.discriminator = response.data.discriminator
        ssn.userid = response.data.id
        
        if (response.data.avatar) {
            ssn.avatar = response.data.avatar
            if (response.data.avatar.startsWith("a_")) {
                ssn.pfp = `https://cdn.discordapp.com/avatars/${ssn.userid}/${ssn.avatar}.gif`
            } else {
                ssn.pfp = `https://cdn.discordapp.com/avatars/${ssn.userid}/${ssn.avatar}.png`
            }
        } else {
            ssn.pfp = `https://cdn.discordapp.com/embed/avatars/${ssn.discriminator % 5}.png`
        } 
    } catch(ex) {
        console.error('axios request ex:', ex)
    }
    
    console.log(result)
    console.log(ssn.login)
    console.log(ssn.username)
    console.log(ssn.discriminator)
    console.log(ssn.userid)
    
    if (ssn.avatar) {
        console.log(ssn.avatar)
    }
    
    console.log(ssn.pfp)
    res.redirect(‘/dashboard’)
});

推荐阅读