2013-03-05 34 views
11

我使用sequelize作爲ORM和passport.js(passport-local)進行身份驗證。我注意到每個HTTP請求都會產生一個單獨的數據庫命令。我開始查看deserializeUser()函數。passport.deserializeUser對每個HTTP請求執行DB(sequelize)命令

當加載一個頁面,這就是我得到:

執行:SELECT * FROM Users WHERE Usersid = 1極限1;

一遍又一遍!

GET/200爲12ms - 780

執行:SELECT * FROM Users WHERE Usersid = 1極限1;

執行:SELECT * FROM Users其中Usersid = 1極限1;

一遍又一遍!

GET /js/ui.js 304 4ms的

一遍又一遍又一遍!

GET /stylesheets/main.css 304 6ms的

執行:SELECT * FROM Users WHERE Usersid = 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文件請求?如果是這樣,是否有減少對數據庫請求數量的方法?

回答

23

這是錯誤中間件訂單的典型結果。您應該使用app.use(或相當於)處理靜態資源的中間件(通常爲express.staticconnect.static之前app.use Passport中間件。其他處理不需要通過Passport運行的請求的中間件也是如此。

這樣,對靜態資源的請求將永遠不會衝擊Passport中間件,因此不會導致那些不必要的數據庫請求。

+1

工作!謝謝! – vilijou 2013-03-05 18:41:27

+0

偉大的解決方案,我有這個問題的變化,並在這裏發佈一個問題http:// stackoverflow。COM /問題/ 34277748/expressjs-passportjs - 反序列化用戶對象換每個請求到一個路由 – Raf 2015-12-14 22:32:25