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