【问题标题】:Post-Redirect-Get in Express Node.jsExpress Node.js 中的 Post-Redirect-Get
【发布时间】:2018-06-17 22:58:44
【问题描述】:

我正在尝试在我的代码中实现 Post-Redirect-Get 设计模式,该模式使用 Express。我所拥有的是:

var sessionVariable;

app.post('/user', function(req, res) {
    sessionVariable = req.session;

    // Sets a session variable to a token
    sessionVariable.token = req.body.token;

    // Redirect to /user
    return res.redirect('/user')
});
app.get('/user', function(req, res) {
    sessionVariable = req.session;

     if(sessionVariable.token){
        res.send('Logged in');
     } else {
        res.send('Not logged in');
     }
});

期望发生的情况是,当用户向 /user 提交 POST 请求时,它将定义 sessionVarlable.token,然后再次重定向到 /user 并检查令牌是否存在。

最终发生的事情是我将提交 POST 请求,并且通过控制台日志记录我可以看到 app.post 触发,但它不会重定向。相反,它似乎卡在了省略 POST 请求的页面上。

这是什么原因?

编辑:任何res 都不会在 app.post 下触发,例如res.send('test') 不起作用。

【问题讨论】:

  • 我认为重定向不会将 HTTP 方法从 POST 更改为 GET。此外,像这样使用全局变量是一种非常糟糕且不安全的做法。假设两个用户同时尝试登录,您创建了一个竞争条件。
  • @PatrickRoberts FWIW 假设这是 express-session 那么这将不是全局的,会话对象是用户范围的。 OP - 您的 POST 调用是否是通过 AJAX 进行的?
  • @James req.session 是用户范围,sessionVariable 不是
  • @James 我的 POST 请求是通过 request 节点模块运行的。它看起来像 request.post('/user', { json: { token: json.access_token } });
  • @PatrickRoberts 它们是同一个变量:/ 不确定我是否看到与您相同的问题 - 它的全局性是什么?

标签: javascript node.js


【解决方案1】:

我已经在别处发布了这个答案:Understanding the "post/redirect/get" pattern

但这里是适合我的代码:

app.post('/data', function(req, res) {
  data = req.body;
  res.redirect('/db.html');
});

【讨论】:

    【解决方案2】:

    根据来自 cmets 的信息,您正在发出 AJAX 请求。与其让客户端从服务器端重定向,不如在客户端进行。这是在浏览器上使用Axios 的示例(您可以使用 AJAX 做同样的事情,只是更麻烦):

    axios.post('/user', { token: 'tokenhere'}).then(function(response) {
        // Status 200 means OK 
        if (response.status === 200) {
            window.location.href = 'user'
        }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2012-02-11
      • 2013-08-19
      • 2012-03-23
      相关资源
      最近更新 更多