2013-03-05 10 views
11

Używam sequelize jako ORM i passport.js (paszport-local) do uwierzytelniania. Zauważyłem, że każde żądanie HTTP skutkuje osobnym poleceniem bazy danych. Zacząłem przeglądać funkcję deserializeUser().passport.deserializeUser wykonujący polecenie DB (sequelize) dla każdego żądania HTTP

Wkładając jedną stronę, to jest to, co mam:

Wykonanie: SELECT * FROM Users GDZIE Users. id = 1 LIMIT 1;

W kółko!

GET/200 12ms - 780

Wykonanie: SELECT * FROM Users GDZIE Users. id = 1 LIMIT 1;

Wykonanie: SELECT * FROM Users GDZIE Users. id = 1 LIMIT 1;

W kółko!

GET /js/ui.js 304 4ms

Ciągle w kółko!

GET /stylesheets/main.css 304 6ms

Wykonanie: SELECT * FROM Users GDZIE Users. id = 1 LIMIT 1;

W kółko!

GET /images/logo.jpg 304 3ms

Oto jak wygląda 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); 
    }); 
}); 

Strona jestem wzywający:

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

Czy deserializeUser powinien być uruchamiany dla każdego żądanego obrazu, html, css? Jeśli tak, czy istnieje sposób na zmniejszenie liczby żądań do DB?

Odpowiedz

23

Jest to typowy wynik nieprawidłowej kolejności oprogramowania pośredniego. Powinieneś app.use (lub odpowiednik) oprogramowania pośredniego, które obsługuje statyczne zasoby (zwykle express.static lub connect.static) przed instalacją oprogramowania pośredniego Passport. To samo dotyczy innych programów pośredniczących, które obsługują żądania, które nie wymagają uruchamiania za pośrednictwem usługi Passport.

W ten sposób żądania zasobów statycznych nigdy nie trafią w oprogramowanie pośredniczące usługi Passport, więc nie będą powodować niepotrzebnych żądań bazy danych.

+1

Pracowałem! Dzięki! – vilijou

+0

Doskonałe rozwiązanie, mam odmiany tego problemu i opublikowałem pytanie tutaj: http: // stackoverflow.com/questions/34277748/expressjs-passportjs-de-serializes-user-object-for-every-request-to-a-route – Raf

Powiązane problemy