2017-04-11 14 views
0

別の場所で使用されるコードをリファクタリングしようとする試みで、コントローラからMongooseモデルへ既に動作していたこのメソッドを移動しました。Mongoose - クエリexec()はモデルメソッドで決して解決しません

モデルでは、trackQuery.exec()は決してコールバックに到達せず、決して解決しません。私がexec()なしで解決するか、exec()を待たずにうまく動作します。 trackQueryは、Mongoose Queryで正しく充填されています。

モンゴースモデルについての微妙な違いは何ですか?

ArtistSchema.methods.insertRelatedTracks = function (items) { 
    const newTracksToSave = items.map((item) => { 
     return new Promise((resolve, reject) => { 
      const TrackModel = mongoose.model('Track'), 
       trackQuery = TrackModel.findOne({ externalID: item.id }) 
      ; 

      return trackQuery.exec((err, track) => { 
       if (err) { 
        return reject(err); 
       } 

       if (!track) { 
        let track = new TrackModel({ 
         externalID: item.id, 
         provider: item.provider, 
         title: item.title, 
         artist: item.artist, 
         artistID: this._id, 
         artistExternalID: this.externalID, 
         thumbnail: item.thumbnail, 
         publishedAt: item.publishedAt, 
         count: 0 
        }); 

        return track.save((err, res) => { 
         if (err) { 
          return reject(err); 
         } 

         return resolve(res); 
        }); 
       } 

       return resolve(track); 
      }); 
     }); 
    }); 

    return Promise.all(newTracksToSave).then(() => { 
     return this; 
    }).catch((err) => { 
     console.error(err); 
     return this; 
    }); 
} 

答えて

0

私のためのソリューションは、手動でTrackModelをインポートする代わりに、通常のランタイムmongoose.model('Track')方法に頼ることでした。この場合、なぜmongoose.modelが動作しないのか説明がありません。ヒントは歓迎されます。

+0

おそらくあなたの問題には関係ないでしょうが、 '.exec()'はすでに約束を返していますので、Mongooseのクエリを '新しいプロミス(...)'で囲む必要はありません。トラックが存在しない場合、空の/未定義の 'track'変数の約束を解決し、' resolve(res) 'の呼び出しの前に解決するということが、あなたの現在のコードの問題です。だからコードは 'if(!track){...} else {return resolve(track)}' – robertklep

+0

@robertklepあなたのコメントをありがとう! :)コードの唯一の違いは 'TrackModel'をインポートする方法なので、間違いなく関連しています。一方、私は、「返品」という約束は、同じ範囲での実行を停止するかどうかという印象を受けていました。 'return track.save ...'は、トラックがない場合に 'return resolve(track);に達するのを防ぐでしょう。私が間違っている? – Azuli42

+1

申し訳ありませんが、私の悪い、私は 'track.save()'の前に 'return'を見逃しました。私のコメントのその部分を無視してください; D – robertklep

関連する問題