web-dev-qa-db-ja.com

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回定義する必要がありますか?

37
pkyeck

最後に、私は以前に与えられたすべての答えを少し使用しています:

  • 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);
});
42
pkyeck

含めてください

app.use(express.cookieParser());

直前

app.use(express.session({

それ以外の場合、以下のエラーがスローされます。

TypeError:未定義のプロパティ「connect.sid」を読み取ることができません

27
Raja

これをセットアップして_connect-mongodb上記のmongoose接続コードが以前に実行されていると仮定します。

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

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 itを使用し、sessionを構成するときにMongoStoreを使用する必要があります。

3
Cory Klein

connect-mongodbはMongooseを使用せず、node-mongodb-nativeドライバーを使用します(i.e.:npm install mongodb)。 Mongooseもこのドライバーに依存しているため、存在する必要があります。

コードを直接 で見ると、DB接続情報をMongoStoreオブジェクトとして提供する必要があります。

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

通常、このために、動的にロードできる「dev」オブジェクトまたは変数が必要になります(dev vs test vs prod)。次に、その構成オブジェクトからHost/port/db/authを取得します。

3
Gates VP

接続の詳細(ホスト、ユーザー名、パスワードなど)のオブジェクトを渡すことができます。

Mongodb:// user:[email protected]/db_nameのような接続URLを渡すこともできます。

これらのメソッドは両方とも、すでにMongoose接続を持っているかどうかに関係なく、自動的に新しい接続を開始します。

最新のコードでは、mongodb.Dbのインスタンスである既存の接続にハンドルを渡すことができます。 mongooseの場合、これはmongoose.connection.dbになります。ただし、このコードは実際のリリースには含まれていないため、試したときに機能しませんでした。おそらくまだ使用する準備ができていない(またはテストされていない)。

次のリリースを待つと、既存のmongoose接続を渡すことができると確信しています。それまでは、mongooseからの接続とconnect-mongodbからの接続という2つの接続を受け入れる必要があります。

https://github.com/tedeh/connect-mongodb から接続情報を取得し、ソースの表示からハンドル情報を取得しました(- relevant commit )。

1
Andz

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)
}));
0
Sean McClory