私はマルチテナントのSaasアプリケーションになるプロジェクトに取り組んでいます。ユーザーのログイン情報に応じてさまざまなデータベースにログインする方法を実装するのが難しいです。現在のところ、Sandboxデータベース(デモ用、定期的にワイプされる)とAlphaデータベース(現在のクライアントのテストと開発用)の間でトラフィックを分割したいだけです。私はログイン時にユーザIDを検出し、mongoose.createConnection()
を使ってデータベースオブジェクトを割り当てる、以下のミドルウェアconfig.js
を作成しました。このキーと値のペアは、memory-cache
を使用してストアに追加されます。 config.js
コードは次のとおりです。ログインしているユーザに基づいて、別のインスタンスMongoDBにコールを誘導するにはどうすればよいですか?
var mcache = require('memory-cache'),
Promise = require("bluebird"),
mongoose = require('mongoose');
Promise.promisifyAll(require("mongoose"));
(function() {
'use strict';
var dbSand = mongoose.createConnection(process.env.DB_SAND);
var dbAlpha = mongoose.createConnection(process.env.DB_ALPHA);
function dbPathConfigMiddlewareWrapper(){
return function setDbPath(req, res, next){
if (req){
if (!mcache.get(req.session.id) && req.body.email){
var login = req.body.email;
if (login === '[email protected]'){
mcache.put(req.session.id, dbSand);
} else {
mcache.put(req.session.id, dbAlpha);
}
}
req.dbPath = mcache.get(req.session.id);
next();
}
};
}
module.exports = dbPathConfigMiddlewareWrapper;
}());
これまでのところとても良いです。しかし私は私のルートで正しいデータベースを呼び出すことに失敗しました。私は、単一のデータベースを使用していたとき、私は簡単にこれを使用することができます。
var connStr = process.env.DBPATH;
if(mongoose.connection.readyState === 0){
mongoose.connect(connStr, function(err) {
if (err) throw err;
console.log('Successfully connected to MongoDB');
});
}
を今、私は無駄にこれをしようとしている:
var connStr = req.dbPath; //where req.dbPath is assigned in the config middleware above.
if(connStr.connection.readyState === 0){
mongoose.connect(req.dbPath, function(err) {
if (err) throw err;
console.log('Successfully connected to MongoDB');
});
}
ここで任意の指導をいただければ幸いです。これははるかに簡単であるはずだと思われるドキュメントのように見えますが、ドキュメントはそれを暗に示していますが、詳しく説明していません。
[この](http://stackoverflow.com/a/19475270/893780)。基本的に、異なるデータベース接続がある場合は、各接続に対してモデルを個別に登録する必要があります。 'mongoose.createConnection()'を使っているので、 'mongoose.connect()'は動作しません。 – robertklep
ありがとう@robertklep、私はそれを読んだが、実装上2つの理由で不明であった。 1.私のデータベースのスキーマは同じですが、明らかに単純なインラインモデルだけがあります。これはスケーラブルではないようです。私は同じスキーマ(現在5つのモデル)を私がリファクタリングするときにあなたの推奨するアプローチは何ですか? 2. 'mongoose.createConnection()'を使用して接続を作成したら、すぐに両方に接続する必要がありますか?その場合、後で正しい接続にどのようにルーティングすればよいですか?または、操作ごとに明示的に接続を開いて閉じる必要がありますか?ありがとう – espressoAndCode