2011-07-25 34 views
36

現在,我將會話數據存儲在與「連接(快速)」捆綁在一起的「內存存儲」中。但我想要/必須改變這種生產方式。node.js + express.js:使用mongodb/mongoose進行會話處理

該應用程序正在使用mongodb,我安裝了貓鼬來處理所有db通信。

例如連接到數據庫初始化我的應用程序後:

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

我發現的Connect-mongodb的模塊,但我不知道如何使用貓鼬實現它,或者如果它實際上是可能的嗎? 我需要添加這樣的事情:

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

還是我直接使用MongoDB的模塊來定義我的DB連接第二次?

回答

41

  • 我來自連接MongoDB的切換連接 - 蒙戈模塊
  • 我使用的是通用的conf對象我的存儲配置數據
  • 有兩種數據庫連接,因爲它更容易處理,我(也許日後發生變化,如果/當貓鼬的新版本/快遞出來)

要求:

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

CONF對象:

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(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); 
    // ... 
}); 

,最後連接使用貓鼬到MongoDB的第二時間:

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

幹得好!只有另外我有一個複利我的煩惱是,以確保您的「app.use(app.router);」被放置在「app.use(express.session ......」之後。 –

+0

感謝信息。編輯的答案,包括這個。 – pkyeck

+9

對於任何想要最近工作的人:從v0.1.9開始,您需要將express設置爲varilable('var express = require('express')'),然後將其傳遞給connect-mongo ('var MongoStore = require('connect-mongo')(express)')。這是有效的,因爲表達式暴露了連接的所有底層部分,而connect-mongo實際上是一個將連接對象作爲參數的函數。 –

3

所以connect-mongodb不使用貓鼬,它使用node-mongodb-native驅動程序(即:npm install mongodb)。貓鼬也取決於這個驅動程序,所以它應該存在。在the code directly

看,你必須提供您的數據庫連接信息爲MongoStore對象:

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

通常對於這一點,你會希望有一些「配置」對象或變量,它可以動態加載(開發vs測試vs產品)。然後,將該配置對象的host/port/db/auth關閉。

+0

您鏈接連接 - 蒙戈,我用連接-的MongoDB的例子。但它們幾乎完全相同,所以我會檢查一下。 – pkyeck

7

看起來你可以做到這一點設置connect-mongodb假設你上面的貓鼬的連接代碼前面運行:

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

我用了app.configure的express.session()()之前,我連接到數據庫。我想,我會定義一個包含所有DB信息配置對象,並嘗試使用連接蒙戈(而非連接-的MongoDB) - 實現看起來比更容易連接,MongoDB的 – pkyeck

+0

在GitHub的頁面的例子並沒有告訴如何與貓鼬一起使用。這個例子有很多幫助。 – mauris

1

您可以在連接的詳細信息(主機,用戶名,密碼等)傳遞一個對象。

您還可以傳入連接url,如mongodb:// user:[email protected]/db_name。

無論您是否已經擁有或將啓動貓鼬連接,這兩種方法都會自動啓動新連接。

在最新的代碼中,您可以將句柄傳遞給現有連接,即mongodb.Db的實例。用貓鼬,這將是mongoose.connection.db。然而,這段代碼並沒有在實際的版本中,當我嘗試它時,它不起作用。可能尚未準備好使用(或未經測試)。

我確定如果您等待下一個版本,您將能夠傳入現有的貓鼬連接。同時你只需要接受兩個連接,一個來自貓鼬,另一個來自connect-mongodb。

我從https://github.com/tedeh/connect-mongodb得到了連接信息和我從查看源代碼(relevant commit)的句柄信息。

在我使用了一下每一個答案,那是之前給出最終
27

請包括

app.use(express.cookieParser()); 

直接之前

app.use(express.session({ 

否則會引發如下錯誤,

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

+2

這可以挽救生命。互聯網在這方面是錯誤的 - 從結果的頂部沒有一個例子甚至提出這個問題。 – antitoxic

+0

非常感謝你 - 修好了! – Joscha

+2

感謝提示,但下次,只需編輯我的答案,並添加缺失的行,以便其他人不必讀取另一個答案... – pkyeck

3

對於快遞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已經被移動到它自己的模塊,所以你需要require吧配置MongoStore當D使用session

+0

在第3行,究竟是什麼在需求陳述之後由(會話)表示。是否(會話)傳遞給mongoStore –

0

我只是碰到mongoose-session

非常輕巧跌跌無縫地爲我工作。從GitHub ...

安裝

npm install mongoose-session 

使用

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

從回購mongoose-session',** INACTIVE。改用connect-mongo。反正更好。** – David