node.js + express.js:mongodb/mongooseとのセッション処理
質問
現在、Connect(Express)がバンドルされている「メモリストア」にセッションデータを保存しています。しかし、私はこれを生産のために変更する必要があります。
アプリケーションはMongoDBを使用しており、すべてのDBコミュニケーションを処理するためにMongooseをインストールしました。
たとえば、アプリを初期化した後、DBに接続します。
var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
app.listen(3000);
}
Connect-MongoDBモジュールを見つけましたが、Mongooseを使用して実装する方法がわかりません。このようなものを追加する必要があります:
var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: 'myDb' })
}));
または、Mongodb-moduleを直接使用してDB接続を2回目に定義する必要がありますか?
解決
最終的に、私は以前に与えられたすべての答えを少し使用しています:
- Connect-MongoDBからConnect-Mongoモジュールに切り替えました
- 一般的なconfオブジェクトを使用して構成データを保存します
- 2つのdb接続があります。これは、私にとって扱いやすいためです(Mongoose/Expressが出てきた場合、または新しいバージョンが出てきた場合)に変更された可能性があります)
要件:
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);
// ...
});
そして最後に、Mongooseを使用してMongodbに2度目に接続します。
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);
});
他のヒント
含めてください
app.use(express.cookieParser());
直前
app.use(express.session({
それ以外の場合は、以下のようにエラーをスローします。
TypeRror:未定義のプロパティ「connect.sid」を読み取れない
これを行うためにこれを行うことができるようです connect-mongodb
上記のマングース接続コードが以前に実行されると仮定します。
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: mongoose.connections[0].db })
}));
そう connect-mongodb
Mongooseを使用せず、使用します node-mongodb-native
運転者 (つまり: npm install mongodb
)。 Mongooseはこのドライバーにも依存するため、存在する必要があります。
見つめている コードは直接, 、DB接続情報をとして提供する必要があります MongoStore
物体:
store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })
通常、このためには、動的にロードできる「構成」オブジェクトまたは変数を使用する必要があります(Dev vs Test vs Prod)。次に、その構成オブジェクトからホスト/ポート/db/authを引き出します。
Express 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
それと使用 session
を構成するとき MongoStore
.
接続の詳細(ホスト、ユーザー名、パスワードなど)のオブジェクトを渡すことができます。
mongodb:// user:pass@host.com/db_nameのような接続urlに渡すこともできます。
これらの両方のメソッドは、マングース接続を既に持っているか開始するかどうかに関係なく、自動的に新しい接続を開始します。
最新のコードでは、ハンドルで既存の接続、つまりのインスタンスに渡すことができます。 mongodb.Db
. 。 Mongooseを使用すると、これはそうでしょう mongoose.connection.db
. 。ただし、このコードは実際のリリースではなく、試してみたときに機能しませんでした。おそらくまだ使用する準備ができていない(またはテストされていない)。
次のリリースを待つと、既存のマングース接続を渡すことができると確信しています。それまでの間、Mongooseからの接続とConnect-Mongodbの2つの接続を受け入れる必要があります。
接続情報を取得しました https://github.com/tedeh/connect-mongodb ソースの表示からハンドル情報を取得しました(関連するコミット).
私はちょうどつまずきます マングースセッション
非常に軽量で、私のためにシームレスに働きました。 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)
}));