passport.deserializeUser 为每个 HTTP 请求执行 DB(续集)命令

Posted

技术标签:

【中文标题】passport.deserializeUser 为每个 HTTP 请求执行 DB(续集)命令【英文标题】:passport.deserializeUser executing a DB (sequelize) command for each HTTP request 【发布时间】:2013-02-19 05:52:56 【问题描述】:

我使用 sequelize 作为 ORM 和 passport.js (passport-local) 进行身份验证。我注意到每个 HTTP 请求都会产生一个单独的数据库命令。我开始研究 deserializeUser() 函数。

加载单个页面时,这是我得到的:

执行:SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

一遍又一遍!

GET / 200 12ms - 780

执行:SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

执行:SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

一遍又一遍!

GET /js/ui.js 304 4ms

一遍又一遍!

GET /stylesheets/main.css 304 6ms

执行:SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

一遍又一遍!

GET /images/logo.jpg 304 3ms

这是 passport.deserializeUser 的外观:

passport.deserializeUser(function(id, done) 
    User.find(id).success(function(user) 
        console.log('Over and over and over!');
        done(null, user);
    ).error(function(err) 
        done(err, null);
    );
);

我请求的页面是:

index: function(req, res) 
    res.render('index', 
        title: "Welcome to EKIPLE!",
        currentUser: req.user
    );

deserializeUser 是否应该为请求的每个图像、html、css 文件运行?如果是这样,有没有办法减少对数据库的请求数量?

【问题讨论】:

【参考方案1】:

这是中间件顺序不正确的典型结果。你应该app.use(或同等的)处理静态资源的中间件(通常是express.staticconnect.static你之前你app.use Passport 中间件。其他处理不需要通过 Passport 运行的请求的中间件也是如此。

这样,对静态资源的请求将永远不会到达 Passport 中间件,因此不会导致那些不必要的数据库请求。

【讨论】:

很好的解决方案,我有这个问题的变体,并在这里发布了一个问题***.com/questions/34277748/…

以上是关于passport.deserializeUser 为每个 HTTP 请求执行 DB(续集)命令的主要内容,如果未能解决你的问题,请参考以下文章

护照身份验证不起作用。从未调用过的 Passport.serializeUser 和 passport.deserializeUser 会被调用

Passport.js 异步与同步反序列化

PassportJS 中间件被多次调用

快速会话和 Cookie