J'ai une application express extrêmement petite pour illustrer un problème que j'ai.
J'utilise connect-redis en tant que magasin de session sur mon application express. J'ai du mal à me connecter simplement. Imprimer simplement req.session.store
résulte en undefined
comme indiqué ci-dessous:
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')
})
La sortie de ceci est:
listening on 3001
**testing**
undefined
Dans la propriété store
, j'ai essayé de me connecter via la propriété url
et la propriété client
en plus des méthodes actuelles Host
et port
.
Je ne vois aucune erreur non plus, alors je ne suis pas sûr de savoir pourquoi la variable store
est toujours indéfinie.
Qu'est-ce qui me manque avec ça?
aussi, j'ai commencé à redis en utilisant redis-server
et je peux me connecter via d'autres clients.
Mise à jour 1
En outre, j’ai regardé ce StackOverflow que certains ont trouvé utile . Le problème est que, à partir de la version 1.5>
de express-session
, il est dit que vous n’avez pas besoin du module cookie-parser
, ne crois pas que ce soit le problème.
req.session
n'aura que des propriétés définies pour la session, vous n'avez jamais défini de propriété de session nommée store
. Vous trouverez ci-dessous un exemple de code de sessions RedisStore actives.
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')
})
Comme indiqué dans mon commentaire, il n'y a pas de propriété native store
sur l'objet req.session
. L'objet connect-redis
hérite de express-session
. Vous devez donc ajouter des propriétés à l'objet req.session
pour conserver votre magasin d'état, comme indiqué ci-dessous:
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')
})
Rendre le magasin de session global, utilisez-le dans app.use (session
app.use la variable globale
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
})