2017-07-04 16 views
0

私は、オブジェクトを反復処理して子を移入するためにクエリを実行するために、それぞれasyncを使用しています。各サイトは、エリアを有するフロアを有するロケーションを有する。しかし、私のサイトと場所は大丈夫ですが、それは停止します。セイルは、フロアとエリアを探していますが、決して割り当てられません。何か案は?それぞれが値を割り当てていないセイルと非同期

gg: function (req, res) { 
    var userID = req.param('id'); 

    User.findOne({ id: userID }).populate('sites').exec(function afterFind(err, foundUser) { 
     if (err) return res.json({ status: 'failure', message: 'Server error' }); 
     if (foundUser === undefined) return res.json({ status: 'failure', message: 'User was not found' }); 

     var resultToJson = foundUser.toJSON(); 
     var sites = resultToJson.sites; 

     async.each(sites, function (site, siteCb) { 
      sails.log.debug('Finding locations for ' + site.name); 
      Locations.find({ site: site.id }).exec(function afterFind(err, foundLocations) { 
       if (err) { 
        siteCb(err); 
       } else { 
        site['locations'] = foundLocations; 

        async.each(site['locations'], function (location, locCb) { 
         sails.log.debug('Finding floors for ' + location.name); 
         Floor.find({ location: location.id }).exec(function afterFind(err, foundFloors) { 
          if (err) { 
           locCb(err); 
          } else { 
           location['floors'] = foundFloors; 

           async.each(location['floors'], function (floor, floorCb) { 
            sails.log.debug('Finding areas for ' + floor.name); 
            Area.find({ floor: floor.id }).exec(function afterFind(err, foundAreas) { 
             if (err) { 
              floorCb(err); 
             } else { 
              floor['areas'] = foundAreas; 
              floorCb(); 
             } 
            }); 
           }, function (floorError) { 
            if (floorError) { 
             locCb(floorError); 
            } 
            else { 
             locCb(); 
            } 
           }); 
          } 
         }); 
        }, function (locError) { 
         if (locError) { 
          siteCb(locError); 
         } else { 
          siteCb(); 
         } 
        }); 
       } 
      }); 
     }, function (siteError) { 
      if (siteError) { 
       sails.log.debug(siteError); 
       return res.json({ status: 'failure', message: 'Server error' }); 
      } else { 
       return res.json({ status: 'success', message: 'Sites for user retrieved', sites: sites }); 
      } 
     }); 
    }); 
} 
+0

'console.log(foundLocations)'はそれが何であるかを見る... –

+0

すべての結果は期待どおりに戻ってくる –

答えて

0

このコードは、foundLocationsでtoJSON()を使用して修正する必要があります。オブジェクトが埋め込まれた(または他のもの)定義済みの属性をオーバーライドするときは、ORM返されたオブジェクトを使用するときには機能しません。toJSON()などを使用して、プレーンなJSオブジェクトに割り当てます。

参考:またhttps://stackoverflow.com/a/43500017/1435132

Locations.findpopulateを使用しないように任意の理由は?

+0

toJSONは型エラーを投げます。 '関数ではない'。人口を使用するには、私は各レベル間の双方向関係を作成する必要がありますか?これはあなたが提案するものですか? –

+0

'toJSON'は配列に適用できません。各オブジェクトに適用できます(ORMによって返されます)。双方向の関係について意見を述べるために連絡がとれていない。 – Sangharsh

+0

私はあなたの提案に従ってこれを修正しました。プッシュする前に配列を反復し、toJSONを使用します。ありがとうございました。 –

関連する問題