我使用 sequelize 作为 ORM 和 passport.js (passport-local) 进行身份验证。我注意到每个 HTTP 请求都会产生一个单独的数据库命令。我开始研究 deserializeUser() 函数。
加载单个页面时,这是我得到的:
Executing: SELECT * FROM
Users
WHEREUsers
.id
=1 LIMIT 1;Over and over and over!
GET / 200 12ms - 780
Executing: SELECT * FROM
Users
WHEREUsers
.id
=1 LIMIT 1;Executing: SELECT * FROM
Users
WHEREUsers
.id
=1 LIMIT 1;Over and over and over!
GET /js/ui.js 304 4ms
Over and over and over!
GET /stylesheets/main.css 304 6ms
Executing: SELECT * FROM
Users
WHEREUsers
.id
=1 LIMIT 1;Over and over and over!
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 文件运行?如果是这样,有没有办法减少对数据库的请求数量?
最佳答案
这是中间件顺序不正确的典型结果。您应该 app.use
(或等效的)处理静态资源的中间件(通常是 express.static
或 connect.static
)在您 app.use
Passport 中间件之前。其他处理不需要通过 Passport 运行的请求的中间件也是如此。
这样,对静态资源的请求永远不会碰到 Passport 中间件,因此不会导致那些不必要的数据库请求。
关于node.js - passport.deserializeUser 为每个 HTTP 请求执行 DB( Sequelize )命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213484/