javascript – 如何处理passport.deserializeUser()中的错误?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如何处理passport.deserializeUser()中的错误?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2478字,纯文字阅读大概需要4分钟。
内容图文
我已经像这样配置了Express和Passport:
var express = require("express");
var site = express();
var flash = require("connect-flash");
var passport = require("passport");
site.use(require("cookie-parser")());
site.use(require("body-parser").urlencoded({extended:false}));
site.use(require("express-session")(...));
site.use(flash());
site.use(passport.initialize());
site.use(passport.session());
我有一个很好的股票实现deserializeUser(我正在使用由Bookshelf支持MySQL的本地身份验证):
var db = require("./database.js"); // exports models e.g. db.User
passport.deserializeUser(function(id, done) {
db.User.findById(id).then(function (user) {
done(null, user);
}).catch(function (err) {
done(err, null);
});
});
我遇到了以下特定问题:当从数据库中删除登录用户时(例如,当站点管理员删除用户时),反序列化失败,如预期的那样,具有来自的CustomError(“EmptyResponse”)书架.但是,我不知道如何处理它; done(err,null)最终只会导致错误消息和堆栈跟踪以HTML格式发送回客户端.
问题是:如何在失败时从deserializeUser提供自定义,优雅的错误处理?
现在,如果它简化了事情,我可以在db.User.findById调用中添加{require:false}给我一个空用户而不是错误,但我仍然不知道如何处理它(我还是确实需要处理错误对象,例如,如果数据库服务器已关闭并且存在连接错误).
我想要失败的操作是将用户重定向回登录页面,可能带有描述性的flash消息,但我没有访问deserializeUser中的请求/响应,我不知道如何通信背部.
解决方法:
我找到了一个解决方案.这里的错误可以在Express中间件错误处理程序中处理.所以,例如:
// Note: Must be used *after* passport middleware.
site.use(function(err, req, res, next) {
if (err) {
// Handle deserialization errors here.
} else {
next();
}
});
但一个重要的警告是,如果反序列化失败不可恢复,通过护照访问的所有路由(即使不需要身份验证的路径)将继续失败,这很可能还包括您的登录和注销端点,从而永久性地断开访问直到用户清除他们的饼干.所以你必须强制退出,这是唯一真正的恢复方式:
site.use(function(err, req, res, next) {
if (err) {
req.logout(); // So deserialization won't continue to fail.
} else {
next();
}
});
在此基础上进一步构建,在我的情况下,我想通过flash消息重定向回登录页面.但是你必须要小心:如果登录页面本身发生错误,你需要避免无限重定向,所以:
site.use(function(err, req, res, next) {
if (err) {
req.logout();
if (req.originalUrl == "/loginpage") {
next(); // never redirect login page to itself
} else {
req.flash("error", err.message);
res.redirect("/loginpage");
}
} else {
next();
}
});
当然,您可能只想对CustomError(“EmptyResponse”)执行此操作,或者甚至重新执行deserialize实现中的错误处理,以使其抛出您自己更具体的错误.
有点奇怪的方法,但似乎完成了工作.打开更清洁的建议.
内容总结
以上是互联网集市为您收集整理的javascript – 如何处理passport.deserializeUser()中的错误?全部内容,希望文章能够帮你解决javascript – 如何处理passport.deserializeUser()中的错误?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。