2016-10-16 5 views
1

Я уверен, что будет очевидный ответ, но я не нашел решения ни в официальной документации, ни в любом месте в Интернете.Зачем мне десериализовать пользователя по каждому запросу с помощью PassportJS?

С Passport.js мы должны определить два метода: один для сериализации и один для десериализации пользовательской сессии.

От official documentation я прочитал:

только идентификатор пользователя сериализован для сеанса, сохраняя объем данных, хранящихся в сеансе небольшого. Если последующие запросы принимаются, этот идентификатор используется для поиска пользователя, который будет восстановлен в req.user

Мой первый вопрос касается термина Сериализация, согласно Wikipedia:

сериализации представляет собой процесс перевода структур данных или состояния объекта в формат, который может быть сохранен

Но в мире, созданном исключительно Javascript, поскольку пользователи являются объектами и объектами родной, почему мы сериализуем? Мы могли бы хранить весь объект в сеансе, что его запрещает?

Затем десериализация - это процесс, требующий большого потребления ресурсов из-за взаимодействия с базой данных. Итак, зачем выполнять десериализацию по любому запросу? Не могли бы мы сделать это только один раз и сохранить результат для дальнейших запросов?

Я много читал о PassportJS, и я могу реализовать систему входа в систему, но я хотел бы прояснить эти неясные аспекты. Спасибо.

ответ

0

Как вы говорите, единственными пользовательскими данными, сохраненными в сеансе, является идентификатор пользователя. Если вы хотите кэшировать десериализацию идентификаторов пользователей для пользователей, тогда вам придется поддерживать это самостоятельно (по-видимому, в памяти, поскольку вас беспокоит время получения данных). Проблема заключается в том, что тогда вам необходимо аннулировать/обновлять этот кеш при любых операциях, которые обновляют пользователя (возможно, пользователь меняет свой адрес электронной почты или пароль), иначе вы рискуете иметь устаревшие данные на req.user.

Вы подразумеваете, что работаете с базой данных (а не с хранилищем в памяти, например, с Redis), и беспокоитесь о последствиях производительности, связанных с извлечением пользователя из базы данных по каждому запросу. Невозможно быть уверенным, не зная больше о вашей конкретной настройке, но я думаю, что ваши проблемы, скорее всего, будут необоснованными - один вызов для получения пользовательской записи на основе идентификатора (для которого хорошо оптимизированы базы данных - индекс первичного ключа на SQL, основанный на SQL), не должен добавлять существенную задержку в запрос.

Смежные вопросы