【问题标题】:res.redirect from POSTres.redirect 来自 POST
【发布时间】:2012-07-19 04:42:23
【问题描述】:

由于某种原因,我无法在登录完成后重定向到 /blog。在我的登录控制器中,我有以下内容。

module.exports = {

    post: function(req, res) {
         var login = req.body['login'];                      

         if (login && req.body['login']['password'] == "password") {
            console.log('Granted access');
            res.send({redirect: '/blog'});

         }

         else {
             console.log('wrong password');
             res.redirect('back');

         }

    }

};

jquery ajax

$(document).ready ->

    $('#login-button').click () ->

        $.ajax
            url: '/login'
            type: 'POST'
            data: $('#Password').serialize()
            dataType: 'json'
            success: (data, textStatus, jqXHR) ->
                if typeof data.redirect == 'string'
                    window.location = data.redirect

更新到工作代码

【问题讨论】:

  • 你能告诉我们它到底在做什么吗?你得到什么响应代码?一方面,您需要在初始应用加载期间设置中间件 (app.use(express.bodyParser())),而不是在每个请求过程中。
  • 我更新了它。我根本没有得到任何响应,并且我的 app.use(express.bodyParser()) 在 server.js 中的应用加载中
  • 您正在生成一个 200 响应代码,因此您必须得到一个响应,尽管可能是一个空的正文。您确定正在调用登录控制器的post 函数吗?你看到那些console.log 语句的输出了吗?鉴于您的 if/else,无论如何您都在调用 res.redirect,因此您应该得到一个 301 响应代码。这让我相信它是一个完全不同的路由处理程序来响应请求。
  • 是的,这是之前显示的 console.log 的结果。以上更新
  • 现在我收到 304 响应代码

标签: node.js post express


【解决方案1】:

你不见了return:

return res.redirect('/');

【讨论】:

    【解决方案2】:

    POST 被重定向到 GET。您不能将 POST 重定向到 POST;你可以转发它,但这会很奇怪。我建议向您的 GET 路由添加逻辑,以处理登录用户和未登录用户。

    此外,304 可能意味着您的响应正在被浏览器缓存,因为您使用了 301(永久重定向、登录时非常糟糕等;使用 302)。

    【讨论】:

    • 我意识到这已经很老了,但值得一提的是 res.redirect(307, '...path') 实际上会保留该方法。 POST 会以 POST 作为方法重定向,
    【解决方案3】:

    您不能在 AJAX 之后进行重定向。你需要自己用 Javascript 来做。

    服务器

    post: function(req, res) {
         var login = req.body['login'];          
         app.use(express.bodyParser());
    
    
         if (login && req.body['login']['password'] == "tom") {
            var loginPassword = req.body['login']['password'];
            console.log(loginPassword);
            console.log('Granted access');
            res.send({redirect: '/blog'});
    
         }
    
         ...
    
    }
    

    客户

    $(document).ready ->
        $('#login-button').click () ->
            $.ajax
                url: '/login'
                type: 'POST'
                data: $('#Password').serialize()
                dataType: 'json'
                success: (data, textStatus, jqXHR) ->
                    if typeof data.redirect == 'string'
                        window.location = data.redirect
    

    这应该可行。

    【讨论】:

    • 感谢工作的人,一个问题。你可以从服务器重定向吗?假设我访问了博客并且会话 cookie 没有签出。您可以通过 res.redirect 或其他方式重定向回登录吗?
    • 感谢您的回复。关于为什么它不能从 ajax 而是从浏览器点击中工作,我已经敲了 3 天。
    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 2023-03-03
    • 2021-10-07
    • 2018-08-01
    • 2010-12-19
    • 2023-03-28
    • 2019-01-02
    • 2012-07-12
    相关资源
    最近更新 更多