提交POST请求后重定向页面 [Express 4]

5
/**
 * @api {post} /logout Logout from system
 * @apiName Logout
 * @apiGroup Login
 */
router.post("/logout", function (req, res) {
  req.logout();
  req.session.destroy();
  return res.redirect("/");
});

我看过Node.js Express:如何在处理POST请求后重定向页面?,但是没找到答案。

我最近将注销由GET更改为POST。这样做后,重定向不起作用。

POST /logout 307 4.912 ms - 36
POST / 302 3.922 ms - 23
GET / 200 7.519 ms - -

我可以在客户端手动完成它,但我想知道如何在服务器端完成。这可行吗?

客户端

HTML

<a href="javascript:;" onclick="logOut();">

JS

 function logOut() {
        $.post("/logout");
    }

你的 /logout 路由是来自实际的 HTML 表单提交(没有涉及 JavaScript)还是 JavaScript 生成的 Ajax 调用?我问这个问题是因为 Ajax 调用没有重定向。 - jfriend00
你不能从一个 AJAX 调用中进行重定向。 - Iceman
1个回答

7

你的$.post()是通过Javascript生成的Ajax调用,因此没有重定向。 Ajax发送请求并获取响应。 Ajax调用本身不会改变页面位置。这是Ajax调用的特点。

重定向仅在浏览器加载新页面且服务器告诉它要更改加载的页面源时才起作用,而不是在浏览器仅发送Ajax调用时。

当然,你可以使用客户端Javascript在$.post()完成后决定从客户端重定向。你甚至可以将$.post()的响应设置为新位置,然后客户端Javascript只需将window.location设置为该新URL即可。

function logOut() {
    $.post("/logout").then(function(data) {
        window.location = data.redirectUrl;
    });
}

同时,在服务器端:

router.post("/logout", function (req, res) {
  req.logout();
  req.session.destroy();
  res.send({err: 0, redirectUrl: "/"});
});

我明白了!在实现方面,什么是一个好的做法?服务器发送状态码并让客户端决定?还是应该找到一种方法使服务器为客户端刷新? - Zanko
@Zanko - 我添加了客户端和服务器的选项。 - jfriend00
非常感谢!这里的关键教训是重定向不适用于ajax调用。换句话说,如果没有通知ajax,也许表单提交将触发涉及浏览器加载新页面的POST请求? - Zanko
@Zanko - HTML表单提交会返回新的内容以供浏览器显示。我不知道你是否可以在那里使用302重定向。但是,你可以让返回的内容成为一个简单的页面,其中包含一个脚本,执行你想要的客户端重定向。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接