【问题标题】:Node.js/Express/Jade + Passport.js failureRedirect incorrectly rendering pageNode.js/Express/Jade + Passport.js failureRedirect 错误地渲染页面
【发布时间】:2014-10-10 13:57:54
【问题描述】:

在 /login 验证失败时,passport.js 使用 failureFlash 保存错误消息并重定向到 /login(同一页面)。发送的 HTML 是正确的(即,包括 failureFlash 消息),但在客户端错误地呈现为“未定义”,尽管(在 Jade 模板中)在保证它已定义的逻辑中。我的 HTML (GET /login) 和提交 (POST /login) 的路由使用相同的 URL;这可能是问题的一部分吗?整个代码库可以在here找到。


app.js 本地策略

passport.use(new LocalStrategy(
    function(username, password, done) {
        // asynchronous verification, for effect...
        process.nextTick(function () {
            var user = {'id': 1};
            if(username !== "asdf") {
                return done(null, false, { error: 'Unknown user '+username+'.'});
            }else if(password !== "zxcv") {
                return done(null, false, { error: 'Invalid password.'})
            }

            return done(null, user);
    });
  }
));

app.js 登录 GET 路由

app.get('/login', function(req, res) {
    var m1 = req.flash('error')[0]
    console.log(m1)
    res.render('login', { user: req.user, message: String(m1), sample: "Sanity check."});
});

app.js 登录 POST 路由

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: 'THIS IS A SANITY CHECK ERROR', successFlash: 'Welcome!' }),
    function(req, res) {
        console.log('User login successful.');
        var redirect_to = req.session.redirect_to || '/'
        delete req.session.redirect_to;
        res.send({redirect: String(redirect_to)})
        //res.redirect(200, redirect_to);

    });
    app.get('/logout', function(req, res){
        req.logout();
        res.redirect(200, '/');
    });

client_login.js 与 /login 的 HTML 一起提供

$(document).on('pageinit', function() {
    $(document).on('click', '#submit', function() {
        if($('#username').val().length > 0 && $('#password').val().length > 0){
            // Send data to server through the ajax call
            // action is functionality we want to call and outputJSON is our data
            $.ajax({
                url: '/login',
                data: {action : 'login', username : $('#username').val(), password : $('#password').val()},
                type: 'post',
                async: 'true',
                dataType: 'json'
            })
            .done(function (result) {
                console.log('Done!');
                window.location.replace(result.redirect);
            })
            .always(function (result) {
                console.log('Always!');
            })
            .fail(function (request,error) {
                console.log('Fail!');
                // This callback function will trigger on unsuccessful action
                //alert('Network error has occurred please try again!');
            })
        } else {
            if($('#username').val().length <= 0 && $('#password').val().length > 0) {
                alert('Please fill in your username.');
            } else if($('#username').val().length > 0 && $('#password').val().length <= 0) {
                alert('Please fill in your password.');
            } else {
                alert('Please fill in your username and password.');    
            }
        }
        return false; // cancel original event to prevent form submitting
    })
})

登录.jade

extends layout

block content
    h1= title


    if locals.expose.exists['client_login.js']
        script(src='/dist/javascripts/client_login.js')
    else
        script(src='/javascripts/client_login.js')


    div(style='max-width: 300px; margin:0 auto')
        p(style='text-align: left') Please login to continue.
        - if(typeof message !== 'undefined' && message.length > 0)
            p Error! #{message}
        p= sample

        form(role='form', action='/login', method='post')
            .form-group
                input.form-control(type='text', data-clear-btn="true", name="username", id="username", value="", placeholder='Username')
            .form-group
                input.form-control(type='password', data-clear-btn="true", name="password", id="password", value="", placeholder='Password')
            .form-group
                button(type='submit', name='submit', id='submit' class="ui-btn ui-corner-all") Submit

从底部的服务器发送的 HTML,在顶部呈现的页面。注意“未定义”与“这是一个健全性检查错误”。另请注意,此项目使用 jQuery Mobile。关于可能导致这种行为的任何想法?页面的 javascript 不应该触摸它,但重定向时也没有可见的闪烁,这很好,但让我怀疑。

【问题讨论】:

    标签: node.js express pug passport.js


    【解决方案1】:

    嗯,我很密集。您不能重定向以响应 AJAX 帖子。

    所以,我修改了 AJAX 帖子如下:

            .fail(function (request,error) {
                console.log('Fail!');
                window.location.replace(window.location.href);
    
            })
    

    window.location.replace(window.location.href); 感觉有点笨拙,可能有更好的方法来处理页面刷新,但目前,这可行。

    ...这就是我在这里发帖的原因。橡皮鸭调试成功。

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      相关资源
      最近更新 更多