2013-03-05 10 views
11

私はORMとしてsequelizeを使用し、認証にはpassport.js(パスポート - ローカル)を使用しています。私は、すべてのHTTPリクエストが別々のデータベースコマンドを生成していることに気づいた。私はdeserializeUser()関数を見て始めました。単一のページをロードする際passport.deserializeUserは各HTTPリクエストに対してDB(sequelize)コマンドを実行します

が、これは私が得るものです:実行

:SELECT * FROM UsersUsersid = 1リミット1;

何度も繰り返しています!

GET/200 12msの - 780

実行:UsersUsers SELECT * FROM。 id = 1リミット1;

実行中:SELECT * FROM Users WHERE Usersid = 1リミット1;

何度も繰り返しています!オーバーと何度も304 4msの

/js/ui.js

GET! UsersUsers SELECT * FROM:実行304 6msの

/stylesheets/main.css

GET。 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 
    }); 
} 

ですdeserializeUserは、すべてのイメージ、html、cssファイルが要求されたときに実行されるはずですか?もしそうなら、DBへのリクエスト数を減らす方法はありますか?

答えて

23

これはミドルウェアの誤った注文の典型的な結果です。静的リソース(通常はexpress.staticまたはconnect.static)を処理するミドルウェアapp.use(またはそれと同等のもの)の前にapp.useのPassportミドルウェアが必要です。 Passport経由で実行する必要のない要求を処理する他のミドルウェアも同様です。

このようにして、静的リソースの要求はPassportミドルウェアに決してぶつからず、そのような不要なデータベース要求は発生しません。

+1

Worked!ありがとう! – vilijou

+0

偉大な解決策、私はこの問題のバリエーションがあり、http:// stackoverflowの質問を投稿しました。com/questions/34277748/expressjs-passportjs-de-serializes-user-object-for-every-request-to-a-route – Raf

関連する問題