11

Sequelize を ORM として使用し、passport.js (passport-local) を認証に使用しています。すべての HTTP リクエストが個別のデータベース コマンドになることに気付きました。私は deserializeUser() 関数を見始めました。

単一のページをロードすると、次のようになります。

実行: SELECT * FROM UsersWHERE Users. id=1 リミット 1;

何度も何度も!

GET / 200 12ms - 780

実行: SELECT * FROM UsersWHERE Users. id=1 リミット 1;

実行: SELECT * FROM UsersWHERE Users. id=1 リミット 1;

何度も何度も!

GET /js/ui.js 304 4ms

何度も何度も!

GET /stylesheets/main.css 304 6ms

実行: SELECT * FROM UsersWHERE Users. 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 ファイルに対して deserializeUser が実行されることになっていますか? もしそうなら、DBへのリクエスト数を減らす方法はありますか?

4

1 に答える 1

23

これは、ミドルウェアの順序が正しくない場合の典型的な結果です。Passport ミドルウェアのapp.use、静的リソースを処理するミドルウェア (通常はexpress.staticまたはconnect.static)を使用する必要があります(または同等のもの)。Passport を介して実行する必要のない要求を処理する他のミドルウェアについても同じことが言えます。app.use

そうすれば、静的リソースの要求が Passport ミドルウェアにヒットすることがないため、不要なデータベース要求が発生することはありません。

于 2013-03-05T07:50:06.480 に答える