【发布时间】: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