使用数据呈现页面后,res.redirect无法正常工作

时间:2013-07-17 17:12:49

标签: javascript node.js redirect express ejs

我有一个忘记密码的简单功能,当用户要求更改密码时,他会收到一封带有令牌的电子邮件,并在点击它时发送电子邮件,他将被重定向到一个将带有他新密码的页面。

我所做的是当我点击电子邮件中的链接时,服务器获取请求并且一个函数从链接中获取数据呈现带有数据的页面(使用res.render)然后它应该重定向到呈现的页面

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

我的链接看起来像这样

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

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

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

我的渲染和重定向功能看起来像这样;

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,但问题是如何重定向到该页面。该页面是在EJS及其视图文件夹中制作的。

1 个答案:

答案 0 :(得分:2)

听起来你想要这个流程:

  1. 用户点击指向/api/resetpassword...
  2. 的链接
  3. express运行resetPasswordPage函数
  4. resetPasswordPage使用重置密码表单HTML页面进行响应,并根据查询参数预先填写
  5. 我认为此时您不喜欢浏览器地址栏中的URL,这就是您认为需要重定向的原因。但是你需要那些查询字符串参数,如果你只重定向/resetPassword,你就会失去它们。所以你要么必须使用URL(我建议这是最简单的),要么依赖会话状态和会话cookie。但是,使用passwordResetOK=true之类的标记会话可能会让您面临一大堆CSRF攻击,_csrf查询字符串参数可以防止这种情况发生。
  6. 此处不需要任何重定向,浏览器具有表单。下一步是用户填写表单并使用<form method="post" action="/resetPassword">
  7. 提交
  8. 浏览器执行POST /resetPassword
  9. 表示路由到另一个更改密码的功能,然后发送回成功页面或重定向到主页或其他
  10. 长话短说,我认为你只需要接受URL就是这样,在密码重置操作完成之前你不需要重定向。