【问题标题】:How to app.get after redirecting using express in node js如何在节点js中使用express重定向后app.get
【发布时间】:2017-02-20 03:46:54
【问题描述】:

我是 node js 的新手,这是我的问题。

我将app.js中的代码设置为从登录页面登录后重定向,如下所示,

app.post('/login', function(req, res, next) {
passport.authenticate('local-login', function(err, user, info) {
  if (err) { return next(err); }
  if (!user) { return res.redirect('/login'); }
  req.flash("email");
  var email_address = req.body.email;
  var username = email_address.substring(0, email_address.lastIndexOf("@"));
  global_username = username;
  return res.redirect('/status.html'+'?channel='+username);
  })(req, res, next);
});

现在我想通过 app.get 获取 '/status.html'+'?channel='+username

所以我创建了这样的代码,

app.get('/status.html?channel='+ global_username, isLoggedIn, function(req, res){
  console.log("Logged in");
  var chk_username = req.body.email;
  var temp = chk_username.substring(0, chk_username.lastIndexOf("@"));
  if(temp != global_username){return res.json({success: false, message:"Unauthorized Attempt"});}
});

但是,它并没有通过那个 app.get 函数。我尝试使用 console.log 检查它是否已登录,但没有出现任何内容。

有没有人想办法解决这个问题?

谢谢。

【问题讨论】:

  • 重定向用户后,终止与服务器的连接,从而阻止所有后续路由调用。您可以做的是在重定向之前执行您在获取请求期间执行的代码。
  • @Theodore_Kim 感谢您的评论! :) 那么你的意思是我应该在 res.redirect('/status.html'+'?channel ='+用户名);?
  • 不,我的意思是在重定向客户端之后,您结束了响应过程,这意味着服务器将不再向服务器发送该原始请求的响应。因此,重定向客户端后,您将无法访问 GET 路由。我希望这是有道理的......
  • @Theodore_Kim 哦,好吧,我想我明白了!谢谢你的回答,希望你有一个美好的一天! :)

标签: node.js express redirect get


【解决方案1】:

好的,首先,如果您使用global_username 作为实际的全局变量,这不是一个好主意。这意味着任何人登录时,每个人的价值都会发生变化。我认为这不是您想要的。

此外,您的路线中根本不应该包含查询字符串;这通常不是路由的一部分,只是路径的东西。坦率地说,我什至没有遵循您在该函数中尝试执行的操作,但是您应该注意的另一件事是 get 请求中没有正文,因此即使您点击此中间件,您也不会从 req.body 中获取一个值。

如果您要做的只是重定向到一个 URL,然后可以访问当前用户,那么 passport 会为您在 req 对象中设置它,因此您可以这样做:

app.get('/status.html, isLoggedIn, function(req, res){
  console.log("Logged in");
  if (req.user) return res.send({message: 'Success'});
  return res.status(401).send({message: 'you are not logged in'});
});

【讨论】:

  • 感谢您回答我的问题! :D 嗯.. 是的,你是对的.. :'( 我是新手,所以我有点困惑,想弄清楚我想要什么.. 哈哈.. 无论如何,再次感谢你,希望你有一个伟大的一天!:)
  • 无需道歉,希望您能够根据我们的回答进行排序。
【解决方案2】:

你可以这样做:

app.post('/login', (req, res, next) => {
  passport.authenticate('local-login', function(err, user, info) {
    if (err) return next(err);
    if (!user) return res.redirect('/login');
    req.flash("email");
    var email_address = req.body.email;
    var username = email_address.substring(0, email_address.lastIndexOf("@"));
    global_username = username;
    console.log("Logged in");
    var chk_username = req.body.email;
    var temp = chk_username.substring(0, chk_username.lastIndexOf("@"));
    if(temp != global_username){
      res.json({success: false, message:"Unauthorized Attempt"});
    }       

    return res.redirect('/status.html'+'?channel='+username);
  })(req, res, next);
});

res.redirect 函数结束服务器和客户端之间的连接。因此,它不会到达向它发出的其他路由请求。基本上,您希望在函数内执行代码,而无需二次调用。您仍然可以为这个给定实例之外的调用实现 GET 路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2014-09-17
    • 2014-02-04
    • 2021-01-10
    相关资源
    最近更新 更多