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

2019-07-21 00:02发布

我使用sequelize作为认证的ORM和passport.js(护照本地)。 我注意到,每个HTTP请求产生一个单独的数据库命令。 我开始看deserializeUser()函数。

当加载一个页面,这就是我得到:

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

一遍一遍又一遍!

GET / 200 12毫秒 - 780

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

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

一遍一遍又一遍!

GET /js/ui.js 304个4ms的

一遍一遍又一遍!

GET /stylesheets/main.css 304个6ms的

执行:SELECT * FROM Users WHERE Usersid = 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文件要求? 如果是这样,有减少请求到数据库的数量的方法吗?

Answer 1:

这是一个不正确的中间件秩序的典型结果。 你应该app.use (或等值),其中处理静态资源(通常是中间件express.staticconnect.static )你之前 app.use护照中间件。 这同样适用于该处理不需要通过护照运行请求其他中间件。

这样,静态资源的要求永远不会撞到护照中间件,因此不会导致那些无谓的数据库请求。



文章来源: passport.deserializeUser executing a DB (sequelize) command for each HTTP request