web-dev-qa-db-fra.com

L'application Nœud simple/Express ne reconnaît pas le magasin de sessions

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.

4
qarthandso

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

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

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
})
0
Jew