質問

現在、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)
}));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top