使用Express和NodeJS配置护照时,如果用户的电子邮件地址无效,我会抛出错误。出现此错误后,我想重定向到失败页面,向他们提供有关如何正确登录的说明。有没有更好的方法来做到这一点?如果没有,我将如何以某种方式捕获错误并重定向到新页面。
passport.use(new GoogleStrategy({
clientID : auth.googleAuth.clientID,
/* Settings redacted for brevity */
},
function(token, refreshToken, profile, done) {
User.findOne(
{
"google.id" : profile.id
},
function(err, user) {
if (err) return done(err)
if (user) return done(null, user)
else {
if (email.indexOf("lsmsa.edu") > -1) {
// Code redacted for brevity
} else {
done(new Error("Invalid email address"))
}
}
}
)
}))
答案 0 :(得分:3)
注意:我非常喜欢BlackMamba的回答,添加自定义回调/重定向是一个完全可以接受的选项。
只需将自己的错误处理中间件添加到Express:
passport.use(new GoogleStrategy({
clientID : auth.googleAuth.clientID,
/* Settings redacted for brevity */
},
function(token, refreshToken, profile, done) {
User.findOne({
"google.id" : profile.id
},
function(err, user) {
if (err) return done(err)
if (user) return done(null, user)
else {
if (email.indexOf("lsmsa.edu") > -1) {
} else {
// Throw a new error with identifier:
done(throw {
type: "invalid_email_address",
code: 401,
profileId: profile.id
}));
}
}
}
)
}));
// The error handling middleware:
app.use(function(e, req, res, next) {
if (e.type === "invalid_email_address") {
res.status(e.code).json({
error: {
msg: "Unauthorized access",
user: e.profileId
}
});
}
});
你会注意到我用一个更强大的错误组合修改了这个答案。我已经定义了错误的code
属性以匹配适用的HTTP状态代码 - 在这种情况下,401
:
// callback
done(throw {
// just a custom object with whatever properties you want/need
type: "invalid_email_address",
code: 401,
profileId: profile.id
}));
在错误处理中,我们只需检查类型是invalid_email_address
(您可以随意创建它,但它应该在您的应用程序中保持一致)然后使用“代码”将错误写出来HTTP状态代码:
// e is the error object, and code is the custom property we defined
res.status(e.code).json({
error: {
msg: "Unauthorized access",
user: e.profileId
}
});
var express = require('express');
var app = express();
app.all('*', function(req, res) {
throw {type: "unauthorized", code: 401}
})
app.use(function(e, req, res, next) {
console.log(e);
if (e.code === 401) {
res.redirect("/login")
} else {
res.status(500).json({error: e.type});
}
});
app.listen(9000);
答案 1 :(得分:3)
我认为你可以使用它:
重定向
重定向通常在验证请求后发出。
app.post('/login',
passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
在这种情况下,重定向选项会覆盖默认行为。上 验证成功后,用户将被重定向到家中 页。如果身份验证失败,用户将被重定向回到 另一次尝试的登录页面。
或者这个:
自定义回叫
如果内置选项不足以处理 身份验证请求,可以提供自定义回调以允许 申请成功或失败。
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});