2013-03-05 4 views
11

Ich benutze Sequelize als ORM und Passport.js (Pass-local) für die Authentifizierung. Ich habe festgestellt, dass jede HTTP-Anfrage zu einem separaten Datenbankbefehl führt. Ich fing an, die deserializeUser() -Funktion zu betrachten.pass pass.deserializeUser Ausführen eines DB (Sequelize) -Befehls für jede HTTP-Anfrage

Wenn eine einzelne Seite geladen wird, ist es das, was ich bekommen:

ausführen: SELECT * FROM Users WHERE Users. id = 1 GRENZ 1;

Immer und immer wieder!

GET/200 12 ms - 780

ausführen: SELECT * FROM Users WHERE Users. id = 1 GRENZ 1;

Ausführung: SELECT * FROM Users WHERE Users. id = 1 GRENZ 1;

Immer und immer wieder!

GET /js/ui.js 304 4ms

Immer und immer und immer wieder!

GET /stylesheets/main.css 304 6ms

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

Immer und immer wieder!

GET /images/logo.jpg 304 3ms

Hier ist, wie passport.deserializeUser aussieht:

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

Die Seite, die ich anfordernden bin ist:

index: function(req, res) { 
    res.render('index', { 
     title: "Welcome to EKIPLE!", 
     currentUser: req.user 
    }); 
} 

Ist der deserializeUser sollte für jedes Bild, HTML, CSS-Datei angefordert werden? Wenn ja, gibt es eine Möglichkeit, die Anzahl der Anfragen an die DB zu reduzieren?

Antwort

23

Dies ist ein typisches Ergebnis einer falschen Middleware-Bestellung. Sie sollten app.use (oder das Äquivalent) die Middleware, die statische Ressourcen behandelt (in der Regel express.static oder connect.static) vor Sie die app.use Passport Middleware. Dasselbe gilt für andere Middleware, die Anfragen bearbeitet, die nicht über Passport ausgeführt werden müssen.

Auf diese Weise werden die Anforderungen für statische Ressourcen nie die Passport-Middleware treffen, so dass diese unnötigen Datenbankanforderungen nicht zur Folge haben.

+1

Arbeitete! Vielen Dank! – vilijou

+0

Große Lösung, ich habe eine Variation dieses Problems und schrieb eine Frage hier http: // stackoverflow.com/questions/34277748/expressjs-pass-js-de-serialisiert-user-object-for-alle-Anfrage-an-eine-Route – Raf

Verwandte Themen