2016-08-18 5 views
2

モデルを特定の接続構成とは関係なく宣言したいと思います。モデル宣言とデータベース接続を分離する方法は?

理論的なコードは次のようになります

const connection = require('bookshelf')(knex); 

// Declare User model. 
const User = require('bookshelf') 
    .Model 
    .extend({ 
    tableName: 'user' 
}); 

// Fetch data for data model using a specific instance of Bookshelf. 
User 
    .use(connection) 
    .fetchAll(); 

.useが作らアップ方式です。 APIで同等のメソッドが見つかりません。

このレベルの分離を望む理由は、分離テストを可能にするためです。

答えて

-1

問題は構成上の問題であり、本棚の問題ではないと思います。あなたの最善のアプローチは、ノードで環境変数を使用してデータベース接続文字列を保存することです。アイデアは、実際のコードベースから分離された異なる環境(dev、testing、stage、prodなど)に固有の設定を持つことです。ノードには環境変数を使用する方法がたくさんあるので、それらのすべてには触れません。良いもののいくつかはdotenvnode-foremanです。私たちは主に英雄を扱うので、node-foremanを使用します。 gitにチェックインされていない設定オプションを含む.envファイルがあります。鉱山は次のようになりますので、ノード職長は、JSON .envファイルをサポートしています。

{ 
    "DATABASE_URL": "postgres://user:[email protected]:port/schema", 
    "LOG_LEVEL": "DEBUG" 
} 

それはこれ以上を含めることができますが、あなたのアイデアを得ます。さまざまな環境(つまり、.env.dev、.env.test、.env.stageなど)用に複数の.envファイルを用意しています。繰り返しますが、私はノード-職長を使用するので、私はデフォルトで.envファイルを使用していますnf startでこれを起動しますが、そのように-eフラグを使用することができます。nf -e .env.test start

次に、あなたのアプリでprocess.envでこの設定にアクセスします。次に、db.jsを持つことができます:

const dbOptions = {client: 'postgres', connection: process.env.DATABASE_URL}; 
const knex = require('knex')(dbOptions); 
const bookshelf = require('bookshelf')(knex); 
module.exports = { 
    knex, 
    bookshelf, 
} 

このファイルは、モデルファイルに必要な場所に必要です。あなたのapp.jsで、その後

const bookshelf = require('./db').bookshelf; 
const User = bookshelf 
    .Model 
    .extend({ 
    tableName: 'user' 
}); 

module.exports = { 
    User, 
} 

(またはあなたがユーザーを照会する必要がある場所):これはusermodel.jsに行くかもしれない

ので
const User = require('./usermodel').User; 
User.fetchAll(); 

、あなたはこれを設定したら、 nf -e .env.whatever

+0

サービスに依存すると、これらのテストはユニットテストではなく「サービス統合テスト」になります。これは別の問題を解決しています。 – Gajus

+0

環境変数を設定するためにdotenvまたはforemanを使用する必要はありません。それだけで簡単になります。依存関係なくそれをしたいですか?次のコマンドを実行します。 DATABASE_URL = "postgres://ユーザー:パス@ホスト:ポート/スキーマ" npm start – ricka

関連する問題