【问题标题】:Redirect page after post request [Express 4]发布请求后重定向页面 [Express 4]
【发布时间】:2016-07-19 04:24:23
【问题描述】:
/**
 * @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 : How to redirect page after processing post request?,但无法找到答案。

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

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 调用没有重定向。
  • 你不能从 ajax 调用重定向。

标签: node.js express


【解决方案1】:

没有来自您的$.post() 的 Javascript 生成的 Ajax 调用的重定向。 Ajax 发送一个请求,得到一个响应。 ajax 调用本身不会改变页面位置。这是 Ajax 调用的一个特点。

当浏览器加载一个新页面并且服务器告诉它改变它正在加载的页面到一个新的源时重定向工作,而不是当浏览器只是发送一个 Ajax 调用。

当然,您可以在 $.post() 完成后使用客户端 Javascript 来决定从客户端重定向。您甚至可以将来自 $.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 - 我为客户端和服务器添加了一个选项。
  • 非常感谢!这里的关键教训是重定向不适用于 ajax 调用。所以换句话说,如果没有通知 ajax,也许表单提交会触发一个涉及浏览器加载新页面的 POST 请求?
  • @Zanko - HTML 表单帖子返回新内容供浏览器显示。我不知道你是否可以在那里使用 302 重定向。但是,您可以使返回的内容成为一个简单的页面,其中包含执行您想要的客户端重定向的脚本。
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2018-09-11
  • 1970-01-01
  • 2014-08-03
  • 2019-06-08
  • 2019-03-05
相关资源
最近更新 更多