6

Mongoose モデルが既にロードされた後にロードしようとすると、次のようなエラーがスローされます。

エラー: uncaughtException:Account一度コンパイルされたモデルは上書きできません。date=Fri Feb 26 2016 10:13:40 GMT-0700 (MST)、pid=19231、uid=502、gid=20、cwd=/Users/me/PhpstormProjects/project、execPath=/usr/local/Cellar/ノード/0.12.4/ビン/ノード、バージョン=v5.2.0、argv=[/usr/local/セラー/ノード/0.12.4/ビン/ノード、/usr/ローカル/セラー/ノード/0.12.4/ビン/lab]、rss=73306112、heapTotal=62168096、heapUsed=29534752、loadavg=[1.6005859375、1.84716796875、1.8701171875]、uptime=648559 OverwriteModelError:Account一度コンパイルされたモデルを上書きできません。

これで問題ありませんが、モデルの単体テストを作成しているため、問題が発生しています。

ファイル構造に関するいくつかの基本的な情報...

フォルダー内にある個別のファイルにすべての Mongoose モデルがあり、src/models/これらのモデルをロードするには、フォルダーを要求してMongooseオブジェクトを渡すだけで、src/models/index.jsファイルはすべてのモデルをロードし、のオブジェクトを返します。モデル。ファイルはここindex.jsで見ることができます関連性はありませんが、モデル名は基本的にファイル名であり、.jsはありません)

モデルの単体テストも個別のファイルに分割されるようになりました。モデルごとに 1 つのテスト ファイルがあります。また、各単体テスト ファイルは特定のモデルに焦点を当てていますが、それらの一部は他のモデルも使用しています (前後のタスク用)。

初期の問題

2 番目の単体テスト ファイルを作成しました。それぞれを個別に実行すると、問題なく動作します。しかし、それらすべてを実行すると、モデルを複数回ロードしようとしているという上記のエラーが表示されます。./models各ユニットテストケースで必要なので、複数回ロードしています

最初の解決の試み

after()次のように、個別の単体テスト ファイルを介して、ロードされたすべてのモデルをクリアできるのではないかと考えました。

after(function(done) {
    mongoose.connection.close(function() {
        mongoose.connection.models = {}
        done()
    })
})

まったく機能しませんでした (新しいエラーはありませんが、コンパイルされたエラーが持続した後、同じモデルを上書きできませんAccount)

2 回目の解決の試み (半成功)

モデルが を返そうとしたときに最後の行でエラーをスローする代わりに、モデルMongoose.model()の先頭にロジックを挿入して、モデルが読み込まれているかどうかを確認し、読み込まれている場合はそのモデル オブジェクトを返します。

const thisFile  = path.basename( __filename ).match( /(.*)\.js$/ )[ 1 ]
const modelName = _.chain( thisFile ).toLower().upperFirst().value()

module.exports = Mongoose => {
    // Return this model, if it already exists
    if( ! _.isUndefined( Mongoose.models[ modelName ] ) )
        return Mongoose.models[ modelName ]

    const Schema = Mongoose.Schema

    const appSchema = new Schema( /* ..schema.. */)

    return Mongoose.model( modelName, appSchema )
}

私は今、自分のモデルでそれを試していますが、問題なく動作しているようです (モデルを複数回読み込んでいると言って、上記のエラーが表示されないことを意味します)。

新しい問題

単体テストが実行されるたびに、エラーが表示されます。エラーはモデルごとに 1 回表示されますが、同じエラーです。

$ lab

  ..................................................
  ...

Test script errors:

Cannot set property '0' of undefined
      at emitOne (events.js:83:20)
      at EventEmitter.emit (events.js:170:7)
      at EventEmitter.g (events.js:261:16)
      at emitNone (events.js:68:13)
      at EventEmitter.emit (events.js:167:7)

Cannot set property '0' of undefined
      at emitOne (events.js:83:20)
      at EventEmitter.emit (events.js:170:7)
      at EventEmitter.g (events.js:261:16)
      at emitNone (events.js:68:13)
      at EventEmitter.emit (events.js:167:7)

Cannot set property '0' of undefined
      at emitOne (events.js:83:20)
      at EventEmitter.emit (events.js:170:7)
      at EventEmitter.g (events.js:261:16)
      at emitNone (events.js:68:13)
      at EventEmitter.emit (events.js:167:7)

There were 3 test script error(s).

53 tests complete
Test duration: 1028 ms
No global variable leaks detected

そのスタック トレースにはあまり詳細はありません。

各モデルに追加したコードが原因であるかどうかはわかりませんが、既にロードされているかどうかを確認し、ロードされている場合は、単一の単体テストを実行したときに表示されるか、プロパティを設定できないことのみが表示されます ' 0' of undefined 2 回 (最初のモデルのロードが成功した場合に 1 回、次の 2 つの場合に 2 回...と思います)

誰かが何か意見を持っていれば、私はそれを非常に感謝しています! ありがとう

アップデート

詳細情報を取得するために実行lab --debugしてみましたが、表示されるエラーの周りにスタック トレースは表示されませんが、エラーが 2 倍になります...これは奇妙です。したがって、 justlabを実行するときに 2 があった場合、lab --debug4 が表示されます

また、Winstonを使用してログを記録しています。ログ レベルをデバッグに変更すると、コンソールに多くのデバッグ エントリが表示されますが、これらのエラーに関するエントリは表示されません。単体テストの依存関係で?

エラーは、error.jsファイルから発生したと言っていますが、それ以外のことは何も言っていません。を介してerror.jsを見つけようとしましたが、find . -name 'events.js'結果はありません..奇数

4

1 に答える 1