简单 Node/Express 应用无法识别会话存储

Simple Node/Express app not recognizing Session store

我有一个非常小的 Express 应用程序来说明我遇到的问题。

我在我的 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 属性 进行连接当前的 hostport 方法。

我也没有看到任何错误,所以我不确定为什么 store 总是未定义。

我错过了什么?

,我确实使用redis-server启动了redis并且我能够通过其他客户端连接到它


更新 1
此外,我确实查看了 this Whosebug,有些人认为它很有用。 问题是,从 express-session 的版本 1.5> 开始,它说您不需要 cookie-parser 模块,所以我认为这不是问题所在。

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

如我的评论所述,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')
})

使会话存储全局化,在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
})