Подтвердить что ты не робот

Passport.deserializeUser выполняет команду DB (sequelize) для каждого HTTP-запроса

Я использую sequelize как ORM и passport.js(паспорт-локальный) для аутентификации. Я заметил, что каждый HTTP-запрос приводит к отдельной команде базы данных. Я начал смотреть на функцию deserializeUser().

При загрузке одной страницы это то, что я получаю:

Выполнение: SELECT * FROM Users WHERE Users. id= 1 LIMIT 1;

Снова и снова!

GET/200 12 мс - 780

Выполнение: SELECT * FROM Users WHERE Users. id= 1 LIMIT 1;

Выполнение: SELECT * FROM Users WHERE Users. id= 1 LIMIT 1;

Снова и снова!

GET/js/ui.js 304 4ms

Снова и снова!

GET/stylesheets/main.css 304 6ms

Выполнение: SELECT * FROM Users WHERE Users. id= 1 LIMIT 1;

Снова и снова!

GET/images/logo.jpg 304 3ms

Вот как выглядит паспорт .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 файла? Если да, существует ли способ уменьшить количество запросов к БД?

4b9b3361

Ответ 1

Это типичный результат неправильного порядка промежуточного слоя. Вы должны app.use (или эквивалент) промежуточное программное обеспечение, которое обрабатывает статические ресурсы (обычно express.static или connect.static) перед app.use промежуточным ПО Passport. То же самое относится к другому промежуточному программному обеспечению, которое обрабатывает запросы, которые не требуют запуска через Passport.

Таким образом, запросы на статические ресурсы никогда не будут попадать в промежуточное ПО Passport, поэтому это не приведет к ненужным запросам базы данных.