2013-03-05 3 views
11

Uso sequelize come ORM e passport.js (passport-local) per l'autenticazione. Ho notato che ogni richiesta HTTP si traduce in un comando di database separato. Ho iniziato a guardare la funzione deserializeUser().passport.deserializeUser che esegue un comando DB (sequelize) per ogni richiesta HTTP

Quando si carica una sola pagina, questo è ciò che ottengo:

Esecuzione: SELECT * FROM WHERE UsersUsers. id = 1 LIMIT 1;

Ancora e ancora e ancora!

GET/200 12ms - 780

esecuzione: SELECT * FROM WHERE UsersUsers. id = 1 LIMIT 1;

Esecuzione: SELEZIONARE * DA Users DOVE Users. id = 1 LIMIT 1;

Ancora e ancora e ancora!

GET /js/ui.js 304 4ms

Più e più e più volte!

GET /stylesheets/main.css 304 6ms

esecuzione: SELECT * FROM WHERE UsersUsers. id = 1 LIMIT 1;

Ancora e ancora e ancora!

GET /images/logo.jpg 304 3ms

Ecco come appare 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); 
    }); 
}); 

La pagina che sto chiedendo è:

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

Is il deserializeUser dovrebbe funzionare per ogni immagine, html, file css richiesto? In tal caso, esiste un modo per ridurre il numero di richieste al DB?

risposta

23

Questo è un tipico risultato di un ordine di middleware non corretto. Si dovrebbe app.use (o l'equivalente) il middleware che gestisce le risorse statiche (in genere express.static o connect.static) prima del si il app.use il middleware Passport. Lo stesso vale per altri middleware che gestiscono richieste che non richiedono di essere eseguite attraverso Passport.

In questo modo, le richieste di risorse statiche non colpiranno mai il middleware Passport, quindi non genereranno quelle richieste di database non necessarie.

+1

Ha funzionato! Grazie! – vilijou

+0

Ottima soluzione, ho una variazione di questo problema e ho postato una domanda qui http: // stackoverflow.com/domande/34277748/expressjs-passportjs-de-serializza-utente-oggetto-per-ogni-request-to-a-route – Raf