2011-07-25 15 views
36

W tej chwili przechowuję dane sesji w "magazynie pamięci", który jest dostarczany w pakiecie z połączeniem (express). Ale chcę/muszę to zmienić w produkcji.node.js + express.js: obsługa sesji z mongodb/mongoose

Aplikacja używa mongotb i zainstalowałem mangusta do obsługi wszystkich komunikatów db.

np. Połącz się z DB po uruchomieniu mojej aplikacji:

var mongo = require('mongoose'); 
mongo.connect('mongodb://localhost/myDb'); 
mongo.connection.on('open', function() { 
    app.listen(3000); 
} 

znalazłem moduł connect-MongoDB, ale nie wiem, jak wdrożyć go za pomocą mongoose, lub jeśli jest to rzeczywiście możliwe? muszę dodać coś takiego:

var mongoStore = require('connect-mongodb'); 
// ... 
app.use(express.session({ 
    secret: 'topsecret', 
    maxAge: new Date(Date.now() + 3600000), 
    store: new mongoStore({ db: 'myDb' }) 
})); 

czy muszę definiować moje połączenie db drugi raz stosując bezpośrednio MongoDB moduł?

Odpowiedz

41

w końcu używam trochę każdą odpowiedź, która została podana przed:

  • przeszedłem od connect-MongoDB połączyć-Mongo modułu
  • Używam ogólny obiekt do conf przechowywanie moich danych konfiguracyjnych
  • istnieją dwa połączenia db, ponieważ jest to łatwiejsze w obsłudze dla mnie (może być zmieniony później, jeśli/kiedy nowa wersja mangusta/express wychodzi) wymagania

:

var express = require('express'), 
    MongoStore = require('connect-mongo')(express), 
    mongo = require('mongoose'); 

conf obiektu:

var conf = { 
    db: { 
    db: 'myDb', 
    host: '192.168.1.111', 
    port: 6646, // optional, default: 27017 
    username: 'admin', // optional 
    password: 'secret', // optional 
    collection: 'mySessions' // optional, default: sessions 
    }, 
    secret: '076ee61d63aa10a125ea872411e433b9' 
}; 

wtedy mogę skonfigurować go tak:

app.configure(function(){ 
    // ... 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    secret: conf.secret, 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore(conf.db) 
    })); 
    // important that this comes after session management 
    app.use(app.router); 
    // ... 
}); 

i wreszcie połączyć się MongoDB drugi raz przy użyciu mongoose:

var dbUrl = 'mongodb://'; 
dbUrl += conf.db.username + ':' + conf.db.password + '@'; 
dbUrl += conf.db.host + ':' + conf.db.port; 
dbUrl += '/' + conf.db.db; 
mongo.connect(dbUrl); 
mongo.connection.on('open', function() { 
    app.listen(3000); 
}); 
+0

Dobra robota! Jedynym dodatkiem, który spowodował moje kłopoty, jest upewnienie się, że twój "app.use (app.router);" jest umieszczony po "app.use (express.session ...".) –

+0

dzięki za informacje. edytować odpowiedź, aby to uwzględnić. – pkyeck

+9

Dla każdego, kto próbuje to zrobić ostatnio: wydaje się, że od wersji 0.9.9 musisz ustawić express jako zmienny ('var express = require ('express')'), a następnie przekazać to do connect-mongo ('var MongoStore = require ('connect-mongo') (express)'). Działa to, ponieważ ekspres ujawnia wszystkie podstawowe części połączenia, a connect-mongo jest w rzeczywistości funkcją, która przyjmuje obiekt connect jako argument. –

3

connect-mongodb więc nie używa Mongoose, używa sterownika node-mongodb-native (tj .:npm install mongodb). Mongoose zależy również od tego kierowcy, więc powinien być obecny.

Patrząc na the code directly, musisz podać informacje o połączeniu DB jako MongoStore obiektu:

store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' }) 

Zazwyczaj do tego, będziemy chcieli, aby mieć jakieś „config” obiekt lub zmienną, która może być załadowany dynamicznie (dev vs test vs prod). Następnie wyłączysz host/port/db/auth z tego obiektu konfiguracyjnego.

+0

połączyć połączyć-Mongo, użyłem connect-MongoDB w przykładzie. ale są prawie identyczne, więc sprawdzę to. – pkyeck

7

Wygląda jak można to zrobić w konfiguracji connect-mongodb zakładając swoją mangusta kod połączenia powyżej jest prowadzony wcześniej:

app.use(express.session({ 
    secret: 'topsecret', 
    maxAge: new Date(Date.now() + 3600000), 
    store: new mongoStore({ db: mongoose.connections[0].db }) 
})); 
+0

Używam express.session() w app.configure(), zanim połączyć się z DB. Myślę, że zdefiniuję obiekt konfiguracyjny, który zawiera wszystkie informacje DB i spróbuje użyć connect-mongo (zamiast connect-mongodb) - implementacja wygląda łatwiej niż connect-mongodb – pkyeck

+0

przykład na stronie github nie mówi jak używać z mangustą. ten przykład bardzo pomógł. – mauris

1

można przekazać w obiekcie szczegółów przyłączeniowych (hosta, nazwę użytkownika, hasło, itp) .

Możesz także podać adres URL połączenia, np. Mongodb: // user: [email protected]/db_name.

Obie te metody automatycznie uruchomią nowe połączenie, niezależnie od tego, czy już masz, czy zaczniesz połączenie mongoose.

W najnowszym kodzie można przekazać uchwyt do istniejącego połączenia, instancji o numerze mongodb.Db. W przypadku mangusty byłby to mongoose.connection.db. Jednak ten kod nie znajduje się w rzeczywistej wersji, a kiedy go wypróbowałem, nie działało. Prawdopodobnie nie jest jeszcze gotowy do użycia (lub nieprzetestowany).

Jestem pewien, że jeśli poczekasz na następne wydanie, będziesz mógł przejść do istniejącego połączenia mangusty. W międzyczasie będziesz musiał zaakceptować dwa połączenia, jeden z mangusty i jeden z connect-mongodb.

Mam informacje o połączeniu z https://github.com/tedeh/connect-mongodb i otrzymałem informacje o uchwycie od przeglądania źródła (relevant commit).

27

Proszę podać

app.use(express.cookieParser()); 

bezpośrednio przed

app.use(express.session({ 

Inaczej wyrzuca błąd jak poniżej,

TypeError: Cannot read property 'connect.sid' of undefined

+2

To ratuje życie. Internet jest w tym zły - z góry nie było nawet jednego przykładu, nawet sugerującego o tym. – antitoxic

+0

Dziękuję bardzo - to naprawiło! – Joscha

+2

dzięki za podpowiedź, ale następnym razem, po prostu edytuj moją odpowiedź i dodaj brakującą linię, aby inni nie musieli czytać kolejnej odpowiedzi ... – pkyeck

3

wyraźnego 4x:

var express = require('express'), 
    session = require('express-session'), 
    MongoStore = require('connect-mongo')(session), 
    mongo = require('mongoose'); 

var conf = { 
    db: { 
    db: 'myDb', 
    host: '192.168.1.111', 
    port: 6646, // optional, default: 27017 
    username: 'admin', // optional 
    password: 'secret', // optional 
    collection: 'mySessions' // optional, default: sessions 
    }, 
    secret: '076ee61d63aa10a125ea872411e433b9' 
}; 

app.configure(function(){ 
    app.use(express.cookieParser()); 
    app.use(session({ 
    secret: conf.secret, 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore(conf.db) 
    })); 
}); 

var dbUrl = 'mongodb://'; 
dbUrl += conf.db.username + ':' + conf.db.password + '@'; 
dbUrl += conf.db.host + ':' + conf.db.port; 
dbUrl += '/' + conf.db.db; 
mongo.connect(dbUrl); 
mongo.connection.on('open', function() { 
    app.listen(3000); 
}); 

session został przeniesiony do własnej modułu, dzięki czemu potrzeba require to an d użyj session podczas konfigurowania MongoStore.

+0

W wierszu 3, co dokładnie to jest oznacza przez (sesja) po instrukcji require. Czy to jak (sesja) jest przekazywane do mongoStore –

0

Właśnie natknąć mongoose-session

Bardzo lekki i pracował bezproblemowo dla mnie. Z github ...

Instalacja

npm install mongoose-session 

Zastosowanie

var express = require('express'); 

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/db'); 

var app = express(); 

app.use(require('express-session')({ 
    key: 'session', 
    secret: 'SUPER SECRET SECRET', 
    store: require('mongoose-session')(mongoose) 
})); 
+1

Z repozytorium 'mongoose-session', ** INACTIVE. Zamiast tego użyj connect-mongo. Tak czy inaczej. ** – David