node.js - passport.deserializeUser 为每个 HTTP 请求执行 DB( Sequelize )命令

标签 node.js sequelize.js passport.js

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

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

Executing: SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

Over and over and over!

GET / 200 12ms - 780

Executing: SELECT * FROM Users WHERE Users.id=1 LIMIT 1;

Executing: SELECT * FROM Users WHERE Users.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 WHERE Users.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.staticconnect.static)在您 app.use Passport 中间件之前。其他处理不需要通过 Passport 运行的请求的中间件也是如此。

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

关于node.js - passport.deserializeUser 为每个 HTTP 请求执行 DB( Sequelize )命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213484/

相关文章:

node.js - 在 Heroku 中部署时,Google 回调 url 返回 400

node.js - Loopback Pass用户为空

javascript - 添加 ajax 后 JQuery 不起作用(Node.js、PUG)

node.js - 引用 Typescript .d.ts 文件中定义的其他库类型/接口(interface)

javascript - 带有获取实例的 console.log() 在异步函数中停止执行

javascript - 使用 hasOne 关联 Sequelize Bulk Insert。

javascript - 将麦克风录音机从浏览器发送到谷歌语音到文本 - Javascript

node.js - 使用日志系统/模块/库的原因是什么?

node.js - 用 Node 读取 MongoDB

node.js - Passport js反序列化用户,变量未定义