2017-03-13 9 views
1

私は1台のサーバーに複数のデータベースをインストールしようとしています。このプロセスを開始するには、index.jsエクスポートオブジェクトに1つのデータベースを割り当てて、システムを構築するときに別のDBを追加できるようにします。以下は問題の説明です。SequelizeとNode.js:Module.Exportsとテーブルモデルの問題

server.jsファイルを実行すると、db1データベースの.sync関数がTable1とTable2を同期し、そのポートでリッスンを開始します。その明確なserver.jsファイルは、module.exports = dbからvar db = require('./models')まで受信しています。しかし、モデル/ Table1.jsファイルでは、サーバーはエラーTypeError: Cannot read property 'Table1' of undefinedをスローします。私はモデル/ Table1.jsのDBのコンソール出力をチェックしましたが空ですので、このモデルではmodule.exports = dbにアクセスしていません。

誰かがこの問題を解決するソリューションを提供できますか?

Table1.jsモデルと上記他のファイルのための部分的なコードは、以下である:

モデル/ Table1.js

var db = require('./.') 
[...] 
var new_instance = db.db1.Table1.build({...}) 

server.js

var db = `require('./models')` 
[...] 
db.db1.sync(function(err) {}); 

モデル/ index.js

var sq = new Sequelize(dbname, user, password, config); 

db['db1'] = { 
    Sequelize: Sequelize, 
    sequelize: sq, 
    Table1: sq.import(__dirname + '/...'), 
    Table2: sq.import(__dirname + '/...') 
} 
module.exports = db; 

答えて

1

module.exports = dbは、Table1.jsモデルにあなたがindex.jsファイルを必要としindex.jsファイルには、モデルの定義が含まれるようにrequire(path)を行いsequelize.import()通話を行うという事実にアクセスされているが、あなたはmodels/index.jsmodels/Table1.js間の循環依存を作成しましたあなたのケースではrequire('./Table1.js')が呼び出されます。循環的な依存関係があります。

この状況を回避するには、別の場所にvar new_instance = db.db1.Table1.build({...})を配置することを検討する必要があります。モデル定義を持つファイルは、モデル定義を作成するためにのみ使用し、追加の操作を実行しないようにしてください。

このような状況にどのように対処できるかは、How to deal with cyclic dependencies in Node.jsをご覧ください。

EDIT

あなたのコメントによると、あなたがを必要としない場合には行うことができますscript.js

var db = require('./models'); 
var new_instance = db.db1.Table1.build({...}); 

で構造以下

- script.js 
- models 
    - index.js 
    - Table1.js 

で簡単な例を考えてみましょういずれかのファイルp内にscript.js内側にはmodelsディレクトリがあります。

+0

var new_instance = db.db1.Table1.build({...})のコードをスクリプトに挿入して、データをDBに保存できますか? – JnL

+0

はい、簡単な例を示すために答えを編集しました。 – piotrbienias

+0

明確な答えと説明をいただきありがとうございます。私は今日まで印象があったことを知っています。すべてのDBセーブコマンドはモデル内で実行しなければなりません。あなたのガイダンスごとにシステムのロジックを書き直すことができました。すごくうまくいった! – JnL

関連する問題