passport.deserializeUser为每个HTTP请求执行一个DB(sequelize)命令
我使用sequelize作为ORM和passport.js(passport-local)进行身份validation。 我注意到每个HTTP请求都会产生一个单独的数据库命令。 我开始看deserializeUser()函数。
当加载一个单一的页面,这是我得到的:
执行:SELECT * FROM
Users
WHEREUsers
。id
= 1 LIMIT 1;一遍一遍又一遍!
GET / 200 12ms – 780
执行:SELECT * FROM
Users
WHEREUsers
。id
= 1 LIMIT 1;执行:SELECT * FROM
Users
WHEREUsers
。id
= 1 LIMIT 1;一遍一遍又一遍!
GET /js/ui.js 304 4ms
一遍一遍又一遍!
GET /stylesheets/main.css 304 6ms
执行:SELECT * FROM
Users
WHEREUsers
。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 }); }
是反序列化用户应该运行的每个图像,html,css文件请求? 如果是这样,有没有办法减less对数据库的请求数量?
这是不正确的中间件订单的典型结果。 在使用Passport中间件之前,您应该app.use
(或等效的)处理静态资源的中间件(通常为express.static
或connect.static
)。 其他处理不需要通过Passport运行的中间件也是如此。
这样,对静态资源的请求将永远不会碰到Passport中间件,所以不会导致那些不必要的数据库请求。