Ответ 1
Просто назначьте пустой объект:
req.session = {};
... и сборщик мусора сделает все остальное автоматически.
ОБНОВЛЕНИЕ:. Поскольку этот ответ спорный, я хотел бы предоставить более подробную информацию о точке.
Решение, приведенное выше, сделает работу для автора в текущей ситуации, а также любое другое действительное решение, предоставленное в этом вопросе. В основном это зависит от способа, которым разработчик хочет управлять устаревшими данными.
Объект сеанса может содержать данные, которые связаны с другой переменной, а установка нового пустого объекта на req.session
не приведет к остановке ссылки на старые данные, поэтому старые данные будут доступны там, где это необходимо. Хотя правильный способ сохранить старые данные - клонировать исходный объект, сценарии реальной жизни могут быть разными. Рассмотрим следующий пример:
req.session.user = { name: 'Alexander' }; // we store an object in the session
var session = req.session; // save reference to the session in a variable
console.log( req.session, session ); // {user: Object}, {user: Object}
req.session = {}; // let replace session with a new object
console.log( req.session, session ); // {}, {user: Object}
Мы все еще можем извлекать старые данные из переменной session
, но req.session
пуст: здесь установка нового объекта работает как альтернатива глубокому клонированию. Сборщик мусора не удалит данные из старого объекта req.session
, поскольку он все еще ссылается на переменную session
.
Глубокая очистка объекта с помощью метода @Dave или короче через Object.keys
(который игнорирует свойства в цепочке прототипов и не требует каких-либо прокладок для node.js):
Object.keys(object).forEach(function(key) { delete object[key]; });
... явно удалит все значения из объекта req.session
, и поскольку переменная session
связана с одним и тем же объектом, session
также станет пустым. Посмотрите, как это работает:
req.session.user = { name: 'Alexander' }; // we store an object in the session
var session = req.session; // save reference to the session in a variable
console.log( req.session, session ); // {user: Object}, {user: Object}
Object.keys(req.session).forEach(function(key) { delete req.session[key]; });
console.log( req.session, session ); // {}, {}
Как вы можете видеть сейчас, в обоих случаях мы получаем пустые объекты.
С точки зрения скорости и памяти установка нового пустого объекта будет намного быстрее, чем очистка свойства старого объекта по свойству, однако с учетом памяти, если старые данные все еще упоминаются где-то, новый объектный подход не освободит память от старых данных потребляет.
Совершенно очевидно, что выбор подхода, который требуется предпринять, в основном зависит от вашего сценария кодирования, но в большинстве случаев req.session = {};
выполнит эту работу: он быстрый и короткий. Однако, если вы сохраняете ссылки на исходный объект в других переменных, вы можете рассмотреть возможность удаления глубоких неявных свойств объекта.