1. ホーム
  2. node.js

[解決済み] Require は空のオブジェクトを返す

2022-05-13 12:49:55

質問

私は、index.jsといくつかのモデル(クラス)があるフォルダーを持っています。 index.js

module.exports = {
   Book : require('./book'),
   Author : require('./author')
}

book.js

var Author = require('./author')
var Book = models.ActiveRecord.extend({
    schema : {
        belongsTo : {
            author : Author
        }
    }
})
module.exports = Book

author.js

var Book = require('./book')
var Author = models.ActiveRecord.extend({
    schema : {
        hasMany : {
            author : Book
        }
    }
})

module.exports = Author

問題は、AuthorクラスがBookを見つけられないようなことです。これは、ただの空のオブジェクトです。 しかし、index.jsのexportsを切り替えて、Authorの後にBookを置くと、それは動作しますが、他のモデルが動作しなくなります。

ハックして動作させるようなことはしたくありません。

どのように解決するのですか?

これは、循環的な依存関係があるためです。Node.jsはこれを非常に特殊な方法で処理します。

  1. 最初のモジュールがロードされ、実行されます(この場合。 book.js ). それ( book.js ) は、2番目のモジュールをロードして実行します ( author.js )のときに、その( book.js ) が必要で、もう一方の ( author.js )

  2. 2番目のモジュール( author.js )がロードされ、実行されると、それ( author.js ) は、最初のモジュール ( book.js )が、それ( author.js ) を受け取ることになります。 部分充填 book.jsがauthor.jsを必要とする前にexportsで設定されたものが、そのオブジェクトに含まれることになります。

  3. その後 book.js が完全に実行されると、オブジェクト author.js から取得した require('./book') は、完全な book.js モジュールオブジェクト

詳しくは、こちらのドキュメントをご覧ください。 http://nodejs.org/api/modules.html

ActiveRecordのオブジェクトにスキーマを動的に追加することができれば、解決する方法の1つです。実は、これはちょっと厄介な状況なんです。実際、モジュール・システムがなくても、これは問題が発生します。このコードをすべて1つのファイルにまとめた場合、どのように動作させるのでしょうか。