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

vil*_*jou 11 node.js sequelize.js passport.js

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

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

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

一遍一遍又一遍!

GET/200 12ms - 780

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

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

一遍一遍又一遍!

GET /js/ui.js 304 4ms

一遍一遍又一遍!

GET /stylesheets/main.css 304 6ms

执行:SELECT*FROM UsersWHERE 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

我要求的页面是:

index: function(req, res) {
    res.render('index', {
        title: "Welcome to EKIPLE!",
        currentUser: req.user
    });
}
Run Code Online (Sandbox Code Playgroud)

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

rob*_*lep 23

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

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