Приложение Simple Node / Express не распознает хранилище сеансов

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

Я использую connect-redis в качестве хранилища сеансов в моем экспресс-приложении. Однако у меня проблема с подключением к нему. Простая распечатка req.session.store приводит к undefined, как показано ниже:

const session = require('express-session')
const app = require('express')()
const RedisStore = require('connect-redis')(session);

const isDev = process.env.NODE_ENV !== 'production'

app.use(session({
  store: new RedisStore({
    host: 'localhost',
    port: 6379
  }),
  secret: 'super-secret-key', // TBD: grab from env
  resave: false,
  saveUninitialized: false,
  cookie: {
    maxAge: 1000 * 60 * 60 * 24,
    secure: !isDev, // require HTTPS in production
  }
}))

app.get('/', (req, res) => {
  console.log('**testing**')
  console.log(req.session.store)
  res.send('rendering this text')
})

app.listen(3001, () => {
  console.log('listening on 3001')
})

Результатом этого является:

listening on 3001
**testing**
undefined

В свойстве store я попытался подключиться через свойство url и свойство client в дополнение к текущим методам host и port.

Я тоже не вижу ошибок, поэтому не уверен, почему store всегда не определен.

Что мне здесь не хватает?

также, я запустил redis, используя redis-server, и могу подключиться к нему через других клиентов


Обновление 1
Кроме того, я просмотрел этот StackOverflow, который некоторые сочли полезным. Проблема в том, что начиная с версии 1.5> из express-session говорится, что вам не нужен _14 _ модуль, поэтому я не думаю, что проблема в этом.


person qarthandso    schedule 29.12.2018    source источник
comment
По какой причине вы ждете store недвижимость? Я не вижу этого в документации. Насколько я понимаю, ваш магазин хранится в самом свойстве session. req.session определен?   -  person willascend    schedule 01.01.2019


Ответы (3)


req.session будет иметь только те свойства, которые установлены для сеанса, вы никогда не устанавливали свойство сеанса с именем store. ниже приведен пример кода рабочих сессий RedisStore

const express = require('express');
const app = express();
const session = require('express-session');
const RedisStore = require('connect-redis')(session);

const redis = require('redis');
const client = redis.createClient({
  host: '127.0.0.1', 
  port: 6379
});
client.on('error', function (err) {
  console.log('could not establish a connection with redis. ' + err);
});
client.on('connect', function (err) {
  console.log('connected to redis successfully');
});

app.use(session({
  store: new RedisStore({client: client}),
  secret: 'super-secret-key',
  resave: true,
  saveUninitialized: true,
  cookie: {
    ttl: 30 * 10000,
    httpOnly: true,
    secure: false
  }
}));

app.get('/', (req, res) => {
  client.get('user', (err, data) => {
    console.log('data in redis:', data)
  });
  res.status(200).send('OK');
});

app.get('/login', (req, res) => {
  if (req.session.user) {
    res.redirect('/')
  } else {
    client.set('user', JSON.stringify({username: 'Adeeb'}))
  }
  res.send('login');
})

app.get('/logout', (req, res) => {
  req.session.destroy();
  res.send('logout');
});

app.listen(3001, () => {
  console.log('server running on port 3001')
})
person Adeeb basheer    schedule 01.01.2019

Как отмечалось в моем комментарии, у объекта req.session нет собственного свойства store. Объект connect-redis наследуется от express-session, поэтому вы должны добавить свойства к объекту req.session для хранения вашего хранилища состояний, как показано ниже:

const session = require('express-session')
const app = require('express')()
const RedisStore = require('connect-redis')(session);

const isDev = process.env.NODE_ENV !== 'production'

app.use(session({
  store: new RedisStore({
    host: 'localhost',
    port: 6379
  }),
  secret: 'super-secret-key', // TBD: grab from env
  resave: false,
  saveUninitialized: false,
  cookie: {
    maxAge: 1000 * 60 * 60 * 24,
    secure: !isDev, // require HTTPS in production
  }
}))

app.get('/', (req, res) => {
  console.log('**testing**')
  console.log(req.session)
  console.log(req.session.id)
  res.send('rendering this text')
})

app.get('/login', (req, res) => {
  console.log(`Session ID: ${req.session.id}`)
  req.session.userId = 1
  res.redirect('/home')
})

app.get('/home', (req, res) => {
  if (req.session.userId) {
    res.send(`You are officially logged in. Your session will expire at ${req.session.cookie.expires}`)
  } else {
    res.redirect('/expired')
  }
})

app.get('/expired', (req, res) => {
  res.send('Oops. This session has expired')
})

app.listen(3001, () => {
  console.log('listening on 3001')
})
person willascend    schedule 01.01.2019

Сделайте хранилище сеансов глобальным, используйте его в app.use (session

app. использовать глобальную переменную

var store = new RedisStore({
host: 'localhost',
port: 6379
})

app.use(session({
store ,
secret: 'super-secret-key', // TBD: grab from env
resave: false,
saveUninitialized: false,
cookie: {
 maxAge: 1000 * 60 * 60 * 24,
 secure: !isDev, // require HTTPS in production
}
}))

app.use((req,res)=>{
req.session.store=store
})
person Jew    schedule 07.01.2019