2015-07-31 14 views
5

Używam Redis jako magazynu sesji i chciałbym również utworzyć niestandardowy identyfikator sesji z express-session. Do tej pory osiągnąłem było stworzenie sesję z ciągłego łańcucha tak:Jak wygenerować niestandardowy identyfikator sesji z sesją ekspresową?

redis configuration

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var compression = require('compression'); 
var session = require('express-session'); 
var redis = require('redis'); 
var RedisStore = require('connect-redis')(session); 

var routes = require('./routes/index'); 
var api = require('./routes/api'); 

var app = express(); 
var client = redis.createClient(); 

// compress all requests 
app.use(compression()) 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(session({ 
    secret: 'SECRET', 
    resave: false, 
    saveUninitialized: false, 
    store: new RedisStore({ host: 'localhost', port: 6379, client: client}), 
    cookie: { 
    maxAge: 60000 
    }, 
    genid: function(req) { 
    return "myApiKey"; 
    } 
})); 
app.use('/', routes); 
app.use('/request_api', api); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

który tworzy klucze w REDiS jak poniżej:

127.0.0.1:6379> keys * 
1) "sess:myApiKey" 

Ja jednak nie mógł wygenerować unikalny identyfikator z uuid jak wspomniano w dokumencie tutaj session-store github. Próbowałem wstawienie wartości sesji w moim pliku tras Index (routes/index.js) jak to

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    req.session.user = "12345"; 
    res.render('index', { title: 'MyApp' }); 
}); 

Ale nie mógł odczytać wartość wewnątrz genid funkcji w zależności od wartości undefined. Moje pytanie brzmi:

Czy mogę wygenerować identyfikator sesji z uuid dowolnego modelu, takiego jak user->uuid? Jeśli tak, jak mogę to zrobić?

Dzięki, każda pomoc zostanie doceniona.

+0

Podobne pytanie zostało szeroko odparte: https://stackoverflow.com/questions/36875701/nodejs-express-global-unique-request-id/47261545#47261545 –

Odpowiedz

1

Możesz zrobić tak.

var crypto = require('crypto'); 
    var uuid = require('node-uuid'); 

Trzeba wymagać Node-UUID, a następnie w genid funkcji

genid:function(req){ 
    return uuid.v1(); 
}, 

lub w celu uniknięcia kolizji id

genid:function(req){ 
    return crypto.createHash('sha256').update(uuid.v1()).update(crypto.randomBytes(256)).digest("hex"); 
}, 

Można uzyskać dostęp do identyfikatora sesji w dowolnym miejscu na wniosek req.sessionID.

Powiązane problemy