javascript - 使用 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 发送。我指的重定向是代码块中显示的最后一个。感谢您花时间阅读我的第一个问题。
谢谢, 里斯
解决方案
在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’)
});
推荐阅读
- azure - 在哪里可以找到用 Powershell 编写的 Http 触发函数的应用服务日志?
- spring - 正文中的 Spring Boot OAuth2RestTemplate 客户端凭据
- botframework - Teams Auth:如何在 oAuth 登录后检索令牌响应?
- kubernetes - kubelet 无法创建挂载点'
- reactjs - React Native:根据是否处于活动状态更改组件属性的布尔值
- php - Laravel localhost api 服务器错误(截断...)
- cookies - 使用 SameSite to Strict,如何阻止不支持该功能的浏览器?
- javascript - 如何从同一类创建 2 个不同的实例?
- android - 使用 tus-android-client 将视频上传到 vimeo,上传不会恢复,而是在恢复时从 0 重新开始
- android - 使用 arrayList.remove(position) 时应用程序崩溃