快递服务器重定向问题

时间:2019-04-29 20:52:53

标签: node.js reactjs express next.js

我正在使用React和Express构建/学习一个Web应用程序。所有路线和重定向均有效,但URL不会更改,并且在我手动转到URL之前,我的道具不会通过。

例如;

成功登录后(使用MongoDB的本地护照),它将呈现主页,但由于我没有任何数据(用户ID或电子邮件等),所以它是空的,但是如果手动输入URL或在nav-上按主页按钮,酒吧,它的工作原理或如果我注销它注销,但URL停留在/ logout而不是/ login。下面的示例代码:

server.js

...
server.use((req, res, next) => {
  res.locals.success_msg = req.flash("success_msg");
  res.locals.error_msg = req.flash("error_msg");
  res.locals.error = req.flash("error");
  res.locals.messages = req.flash();
  res.locals.user = req.user;
  next();
});

server.get("/index", ensureAuthenticated, (req, res) => {
  const msg = {name: req.user.name, email: req.user.email};
  return app.render(req, res, "/index", msg);
});

server.post("/login", (req, res, next) => {
  passport.authenticate("local", function(err, user, info) {
    if (err) {
      return next(err);
    } else if (!user) {
      req.flash("error_msg", info.message);
      return app.render(req, res, "/login", req.flash());
    } else {
      req.logIn(user, function(err) {
        if (err) {
          return next(err);
        }
        req.user = user.name;
        return app.render(req, res, "/index", user.name);
      });
    }
  })(req, res, next);
});

server.get("/logout", (req, res) => {
  req.logOut();
  req.flash("success_msg", "done!");
  return app.render(req, res, "/login", req.flash());
});

server.get("*", ensureAuthenticated, (req, res) => {
  return handle(req, res);
});

1 个答案:

答案 0 :(得分:1)

我认为您登录方法上的return app.render(req, res, "/index", user.name);实际上是redirect

渲染器要做的是获取文件和您提供的数据,然后将其作为响应发送回浏览器。

但是,您要尝试执行的操作是,如果登录过程成功,则使用户转到其他URL,这可以通过执行以下操作来实现:

res.redirect('/index')

这将使服务器转到您的index路由,这将依次执行加载用户数据所需的所有代码!

通过查看快速文档,您可以了解有关redirectrender的更多信息。