Почему мои экспресс-сеансы не сохраняются и почему я получаю новый сеанс (или несколько сеансов), созданный для каждого запроса - PullRequest
2 голосов
/ 12 октября 2019

У меня есть базовое экспресс-приложение node.js, использующее экспресс-сеансы.

Может кто-нибудь помочь с тем, почему сеансы не сохраняются и почему для каждого запроса создается новый сеанс.

Само приложение довольно большое, поэтому я добавил уменьшенный регистр важных настроек ниже.

const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);

// initialise express
const app = express();
// initialise db session store
const store = new MongoDBStore({
  uri: MONGODB_URI,
  collection: 'sessions',
  // can also set expire here for auto cleanup by mongodb
});

app.use(session({
  secret: 'secret password',
  resave: false,
  saveUninitialized: false,
  httpOnly: false,
  secure: app.get('env') === 'production',
  store,
}));

...routes

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

1 Ответ

0 голосов
/ 12 октября 2019

ОБНОВЛЕНИЕ

TL: DR; - robots.txt вызывает проблемы, если их не устранить, установите для DEBUG env значение express-session для устранения неполадок

После долгих размышлений я нашел решение и несколько полезных советов по устранению неполадок.

при запуске приложения запустите его с отладкой, установленной в express-session.

так что для тех из вас, кто новичок в этом, как я, запустите ваше приложение с командой, подобной этой:

DEBUG=express-session node 'bin/www.js'

или

DEBUG=express-session node app.js

в зависимости от того, как вынастройте точку входа вашего приложения.

При этом будут выводиться сообщения журнала, относящиеся к сеансу, чтобы вы могли выяснить, отправляется ли файл cookie с каждым запросом или нет. сообщения об ошибках будут выглядеть примерно так:

  express-session fetching 0wgmO1264PsVvqeLqaIIXd6T0ink0zts +34s
  express-session session found +49ms

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

// see what requests are being sent and which ones contain cookies
app.use((req, res, next) => {
  const { url } = req;
  const isCookieSent = req.headers.cookie;
  console.log({ url });
  console.log({ isCookieSent });
  next();
});

После этого я обнаружил, что виновником был файл robots.txt, по-видимому, единственный путь, которыйпо умолчанию игнорируется значение favicon.ico.

Поскольку этот путь robots.txt не был обработан должным образом, и при этом он не отправлял cookie, он вызывал повторяющиеся запросы и также не сохранял cookie.

Чтобы это исправить, вам нужно либо обработать, либо проигнорировать этот запрос, прежде чем переходить к промежуточному программному обеспечению сеанса.

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

app.get('/robots.txt', (req, res) => {
  res.type('text/plain');
  res.send('User-agent: *\nDisallow: /');
});

Я новичок в node.js, поэтому, если есть кто-то с большим знанием, не стесняйтесь вносить дополнительную информацию или более чистые способы решения этой проблемы. Надеюсь, это избавит некоторых из вас от хлопот!

...