我正在尝试使用Express中间件进行登录请求。默认路由提供了一个重定向到/login?code={login-code}
的外部网址,这会使外部HTTP请求获得user_id
和access_token
。检索这些信息意味着用户已登录,因此应将页面重定向到/home
。但是,我无法使用下面的代码实现此方案。
我认为问题在于,当外部HTTP请求完成并且正文被解码时,请求(到/login
)已完成并且已经呈现响应。我该如何解决这个问题?
app.get('/', function (req, res, next) {
res.render('index', { title: 'Index', login: login_url });
});
app.get('/login', function (req, res, next) {
console.log('CODE: ' + req.query.code);
https.get(getAuthOptions(req.query.code), function(httpRes) {
var data = '';
httpRes.on('data', function(chunk) {
data += chunk;
});
httpRes.on('end', function() {
var jsonData = JSON.parse(data);
req.session.user = {
user_id: jsonData['user_id'],
access_token: jsonData['access_token']
};
if (req.session.user) {
next('route');
}
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
res.render('index', { title: 'Login' });
});
app.get('/home', function (req, res, next) {
console.log(req.session.user);
res.render('index', { title: 'Home' });
});
答案 0 :(得分:0)
简短回答,for (buf = input.ReadLine(); ; buf = input.ReadLine())
{
//Display received irc message
chatbox.Text += "\n " + buf;
//Send pong reply to any ping messages
if (buf.StartsWith("PING ")) { output.Write(buf.Replace("PING", "PONG") + "\r\n"); output.Flush(); }
if (buf[0] != ':') continue;
/* IRC commands come in one of these formats:
* :NICK!USER@HOST COMMAND ARGS ... :DATA\r\n
* :SERVER COMAND ARGS ... :DATA\r\n
*/
}
在处理外部请求之前执行。
答案很长:
理想情况下,res.render
应该有一个post
处理程序,因为它很可能会改变您的应用程序状态。
在login
中只渲染页面
创建.get('/login')
并进行.post('/login')
来电并重定向到https.get
上的/home
。
奖励,使用https://www.npmjs.com/package/request拨打外部电话。