1

Подскажите, как правильно сохранять сессию в NodeJs. Ниже привел содержимое файла app.js

Обновление

В файле app.js

var express = require('express');
var session = require('express-session');
var SessionStore = require('express-mysql-session');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'theme'));
app.set('view engine', 'ejs');

app.use(express.bodyParser());
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());

var options = {
    host: '127.0.0.1',
    port: 3000,
    user: 'nodejs',
    password: 'c5c58f',
    database: 'nodejs'
}

app.use(session({
    key: 'session_cookie_name',
    secret: 'session_cookie_secret',
    store: new SessionStore(options)
}))

app.get('/', function(req, res, next) {
    req.session.number = req.session.number + 1 || 1;
    console.log(req.session.number)
})

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

TypeError: Cannot read property 'number' of undefined

В чем может быть ошибка, я уже вторую неделю не могу решить эту проблему, задавал тот же вопрос на Toster, решения не нашлось. Не ужели в NodeJs нельзя реализовать сохранение сессии в БД MySql. Везде приводят пример с сохранением в MongoDB, может действительно NodeJs на столько ограничен.

Делал по этому уроку.

7
  • Почему при простом сохранении сессии req.session.user = 'user'; Мне пишет TypeError: Cannot set property 'user' of undifined
    – webkostya
    24 авг 2014 в 21:32
  • Скорее всего, вы не подключили сессии, приведите код. var session = require('express-session') var app = express() app.use(session({secret: 'keyboard cat'})) это есть в начале приложения?
    – zb'
    24 авг 2014 в 23:23
  • У вас, наверное, сильно устаревший урок, во-первых, express.session уже session, во-вторых, github.com/chill117/express-mysql-session вроде бы работает, в отличие от connect-mysql-session
    – zb'
    25 авг 2014 в 16:07
  • Спасибо, завтра попробую!
    – webkostya
    26 авг 2014 в 20:28

2 ответа 2

2

вот так работает, обратите внимание на предупреждения при старте, я не стал исправлять, но в продакшене надо следовать этим инструкциям:

app.js

var express = require('express');
var session = require('express-session');
var SessionStore = require('express-mysql-session');
var http = require('http');
var connect = require('connect');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'theme'));
app.set('view engine', 'ejs');

app.use(connect.bodyParser());
app.use(connect.favicon());
app.use(connect.logger('dev'));
app.use(connect.json());
app.use(connect.urlencoded());
app.use(connect.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(connect.cookieParser());

var options = {
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'test'
}

app.use(session({
    key: 'session_cookie_name',
    secret: 'session_cookie_secret',
    store: new SessionStore(options)
}))

app.get('/', function(req, res, next) {
    console.log("aaa");
    req.session.number = req.session.number + 1 || 1;
    console.log(req.session.number)
    res.end("You saw this "+req.session.number.toString()+" times");
    next();
})

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

package.json

{
  "name": "sample1",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "connect": "^2.25.7",
    "express": "^4.8.5",
    "express-mysql-session": "^0.2.0",
    "express-session": "^1.7.6"
  }
}

сложите эти два файла в новую директорию, запустите

 npm install

исправьте пароли к базе данных, потом -

 node app.js

перейдите на http://localhost:3000

перестаньте смотреть видеоуроки.

1
  • Дааааа, работает, ОГРОМНЕЙШЕЕ СПАСИБО !!!
    – webkostya
    27 авг 2014 в 18:05
0
var app = express();

app.use(session({
  secret: 'your secret here',
  resave: true,
  saveUninitialized: true,
  key: 'jsessionid',
  store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

passport.serializeUser(function (user, done) {
   // console.log("serializeUser", user);
   done(null, user.id);
});

passport.deserializeUser(function (id, done) {
   User.findById(id).exec(function (err, user) {
     // console.log("deserializeUser", user);
     done(err, user);
   });
});

app.use(passport.initialize());
app.use(passport.session());

app.post('/api/login', passport.authenticate('local'), function (req, 
res, next) {
  res.cookie('user', JSON.stringify(req.user._id));
  res.send(req.user);
});

app.post('/api/logout', function (req, res, next) {
   req.logout();
   res.clearCookie('user');
   res.send(200).end();
});

app.get('/api/user', function (req, res, next) {
   if (req.user)
      res.send(req.user);
   else
      res.send(false);
});

И надо не забыть подключить все библиотеки.

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.