nodejs新手,喜欢它到目前为止,尝试为护照身份验证做一些自定义处理。成功重定向工作正常,但是在尝试失败后我不想继续发布事件 我试图完成的是触发警报,如果登录尝试出现问题,则会打开一个对话框(这部分按照我想要的方式,通过套接字调用)到当前页面。 如果我不调用res.send(),浏览器就会等待,或者尝试重定向到我不存在的页面。
routes.js
app.post('/login', function (req, res, next) {
passport.authenticate('local-login', function (err, user, msg) {
if (err) {
io.emit('status alert', err);
}
if (!user) {
io.emit('status alert', msg);
//res.send();
}
req.logIn(user, function (err) {
if (err) {
io.emit('status alert', err);
}
if (user) {
return res.redirect('/loginsplash');
}
});
})(req, res, next);
});
passport.js
passport.use(
'local-login',
new LocalStrategy({
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
},
function (req, username, password, done) {
db.getConnection().query("SELECT * FROM users WHERE uname = ?", [username], function (err, rows) {
if (err)
return done(err);
if (!rows.length) {
return done(null, false, 'Invalid Username or Password.');
}
// if the user is found but the password is wrong
if (!bcrypt.compareSync(password, rows[0].upw))
return done(null, false, 'Invalid Username or Password.');
// all is well, return successful user
return done(null, rows[0]);
});
})
);
答案 0 :(得分:1)
经过一个持续性和试验/错误的周末之后,我使用ajax的预感似乎是正确的。我终于遇到了类似的here,这很有帮助。希望这有助于其他人,我可能会调整一些,但现在基本上如果ajax响应为空(res.end),我的自定义对话框会弹出。如果其中包含某些内容(来自res.redirect),则会重定向到目标网页:
passport.js,上面没有变化
routes.js
app.post('/login/ajax', function (req, res, next) {
passport.authenticate('local-login', function (err, user, info) {
if (err) { return next(err); }
if (!user) { return res.end(); }
req.logIn(user, function (err) {
if (err) { return next(err); }
return res.redirect('/loggedin');
});
})(req, res, next);
});
ajax在.ejs页面中调用
$.ajax({
type: "POST",
url: "/login/ajax",
data: { username: username , password: password },
dataType: 'html',
success: function(data) {
if (data) {
window.location.href = '/loginsplash';
}
else {
OpenFeedbackMsgDlg("Login Failed");
}
}
}).done(function () {
console.log("http request succeeded");
alert("login success");
});
});
如果有人有建议/替代方法,我仍然有兴趣学习。