Простое приложение Node / Express не распознает магазин сессий - PullRequest
0 голосов
/ 29 декабря 2018

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

Я использую 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 написано, что вам не нужен модуль cookie-parser, поэтому я не верю, что это проблема.

Ответы [ 3 ]

0 голосов
/ 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')
})
0 голосов
/ 07 января 2019

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

app.use, глобальная переменная

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
})
0 голосов
/ 01 января 2019

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')
})
...