页面呈现数据后res.redirect不工作

我有一个简单的忘记密码的function,当用户请求更改密码时,他会收到带有令牌的电子邮件,并点击它的电子邮件,他将被redirect到一个将使用新密码的页面。

我所做的是当我点击电子邮件中的一个链接时,服务器获取请求,一个函数将数据从链接中提取出来(使用res.render),然后redirect到渲染的页面。

我面临的问题是当我点击链接时,我正在获取数据和页面呈现,但我不能让res.redirect()工作。

我的链接看起来像这样

http://localhost:3000/api/resetpassword?_csrf=ab8aa6a41567f817330e3e0a214725f8b2f88b487d5bef16f162e033c6a63dc41933511ddb79cb44ca049f472b3e0c593dbbaf&email=dummyEmail%2540dumyurl.ca 

然后我使用app.get()获取服务器上的请求。

 app.get('/api/resetpassword', Admin.resetPasswordPage); 

我的渲染和redirectfunction看起来像这样;

 resetPasswordPage: function (req, res, next) { req.query.email = decodeURIComponent(req.query.email) ; res.render('resetPassword', { Email: req.query.email, Csrf : req.query._csrf, }, function (err, html) { console.log("TESTING HTML ", html); if (!err) res.redirect("/resetPassword"); }); } 

由于我在HTML参数中获取了完整的HTML页面,所以渲染成功,但问题是如何redirect到该页面。 该页面是在EJS和它的视图文件夹。

这听起来像你想要这个stream程:

  1. 用户点击链接到/api/resetpassword...
  2. express运行resetPasswordPage函数
  3. resetPasswordPage用重置密码表单的HTML页面进行响应,根据查询参数预先填写
  4. 我认为在这一点上,你不喜欢浏览器地址栏中的url,这就是为什么你认为你需要redirect。 但是你需要这些查询string参数,如果你redirect到/resetPassword ,你会失去它们。 所以你要么必须与URL(我会build议,因为它是最简单的),或依靠会话状态和会话cookie。 但是,使用passwordResetOK=true类的标记会话可能会暴露出大量的CSRF攻击,即_csrf查询string参数存在以防止。
  5. 这里你不需要任何redirect,浏览器就是这样。 下一步是用户填写表格并提交<form method="post" action="/resetPassword">
  6. 浏览器执行POST /resetPassword
  7. 向另一个更改密码的函数表示路由,然后发回成功页面或redirect到主页或其他

所以长话短说,我认为你只需要接受它是什么的URL,你不需要在这里redirect,直到密码重置操作完成后。