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 файла? Если да, существует ли способ уменьшить количество запросов к БД?
Ответы
Ответ 1
Это типичный результат неправильного порядка промежуточного слоя. Вы должны app.use
(или эквивалент) промежуточное программное обеспечение, которое обрабатывает статические ресурсы (обычно express.static
или connect.static
) перед app.use
промежуточным ПО Passport. То же самое относится к другому промежуточному программному обеспечению, которое обрабатывает запросы, которые не требуют запуска через Passport.
Таким образом, запросы на статические ресурсы никогда не будут попадать в промежуточное ПО Passport, поэтому это не приведет к ненужным запросам базы данных.