在呈现响应之前,在ExpressJS中间件中完成外部HTTP调用

时间:2015-08-12 03:55:53

标签: javascript node.js express

我正在尝试使用Express中间件进行登录请求。默认路由提供了一个重定向到/login?code={login-code}的外部网址,这会使外部HTTP请求获得user_idaccess_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' });
});

1 个答案:

答案 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拨打外部电话。