逻辑流程:
1:客户端oauth认证
2:浏览器重定向回带有客户端代码的预定义 URL
3:服务端处理get
方法中的代码,获取客户端的数据
我想要实现的目标:
服务器获取到oauth数据后,将数据发送回客户端,然后客户端的浏览器可以处理这些数据并进行相应的更改。
app.get('/callback', function (req, res, next) {
client.getUser(openid, function (err, result) {
var userInfo = result; //this is client's userInfo
//now how can I send back the userInfo object back to the client?
//If I use res.send() the client's page will be nothing but just the data
//I cannot use socket.io here
//I am not sure If I can use ajax here because usually client does not send a request in the first place
})
})
有没有办法在不改变客户端页面的情况下发回数据?这似乎是一个很容易解决的问题,但我一直摸不着头脑,却什么也没想出来!
最佳答案
如果 Ajax 不是您想要的,您可以将 userInfo
作为响应参数并将其呈现在页面的 html 代码中作为 JavaScript 值。当页面在浏览器中打开时,解析此 JavaScript 值并将其存储到全局变量 (window
)。
将 userInfo
作为响应参数:
app.get('/callback', function (req, res, next) {
client.getUser(openid, function (err, result) {
var userInfo = result; //this is client's userInfo, assume it is JSON.
res.locals.userInfoString = JSON.stringify(userInfo);
})
})
在页面的html代码中渲染它,并在页面加载时解析它(假设使用nunjucks模板,但任何其他模板技术都将支持相同的功能):
<html>
<head>
...
<script type="text/javascript">
var userInfoString = '{{userInfoString}}';
window.userInfo = JSON.parse(userInfoString);
</script>
</head>
...
</html>
这样,您就可以在 JavaScript 代码中访问 window.userInfo
来获取 userInfo 对象。
对于 Ajax 解决方案,您可以在页面加载后发送 Ajax 请求,从服务器获取 userInfo 数据。当检索到 userInfo 数据时,使用 jQuery 或原生 JavaScript 更改相关 DOM。
页面加载后发送 Ajax 请求,获取数据并更改 DOM:
<html>
<head>
...
<script type="text/javascript" src="./js/jQuery.js"></script>
<script type="text/javascript">
$(function() {
$.get('/userInfo', function(data) {
// change DOM with data.
});
});
</script>
</head>
...
</html>
当访问/callback
时,获取userInfo
并保存到数据库中,然后返回页面:
app.get('/callback', function (req, res, next) {
client.getUser(openid, function (err, result) {
var userInfo = result;
// save userInfo into Database.
res.render('callback_page');
})
});
当访问/userInfo
时,获取openid并从数据库读取userInfo数据:
app.get('/userInfo', function (req, res, next) {
// get openid from req
// get userInfo from database by openid
res.json(userInfo);
});
关于node.js - 获取oauth信息后如何将数据发送回客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892490/