Node.js passport.deserializeUser为每个HTTP请求执行DB(sequelize)命令
我使用sequelize作为ORM和passport.js(passport local)进行身份验证。我注意到每个HTTP请求都会产生一个单独的数据库命令。我开始研究反序列化user()函数 加载单个页面时,我得到的结果如下: 执行:从Node.js passport.deserializeUser为每个HTTP请求执行DB(sequelize)命令,node.js,sequelize.js,passport.js,Node.js,Sequelize.js,Passport.js,我使用sequelize作为ORM和passport.js(passport local)进行身份验证。我注意到每个HTTP请求都会产生一个单独的数据库命令。我开始研究反序列化user()函数 加载单个页面时,我得到的结果如下: 执行:从用户中选择*其中用户id=1限制1 一遍又一遍 GET/200 12毫秒-780秒 执行:从用户中选择*其中用户id=1限制1 执行:从用户中选择*其中用户id=1限制1 一遍又一遍 GET/js/ui.js 304 4ms 一遍又一遍 GET/styleshe
用户
中选择*其中用户
id
=1限制1
一遍又一遍强>
GET/200 12毫秒-780秒
执行:从用户
中选择*其中用户
id
=1限制1
执行:从用户
中选择*其中用户
id
=1限制1
一遍又一遍强>
GET/js/ui.js 304 4ms
一遍又一遍强>
GET/stylesheets/main.css 304 6ms
执行:从用户
中选择*其中用户
id
=1限制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文件运行?如果是这样,有没有办法减少对数据库的请求数量?这是中间件顺序不正确的典型结果。您应该
app。在app之前,使用(或同等)处理静态资源的中间件(通常是express.static
或connect.static
)。使用Passport中间件。其他中间件也一样,它们处理不需要通过Passport运行的请求
这样,对静态资源的请求将永远不会击中Passport中间件,因此不会导致那些不必要的数据库请求。很好的解决方案,我有一个关于这个问题的变体,并在这里发布了一个问题