2

ここで奇妙な問題。Node/Express/Mongoose/Leaflet を実行しています。データベースから場所の配列を取得し、コールバックが開始されると、それらの場所を繰り返し処理して、各場所を処理する一連の文字列を見つけます。次に、通路の配列を各位置オブジェクトに追加してから、位置配列を GeoJSON FeatureCollection に追加します。

Location.find({}, { _id: 0 }, function (err, locations) {
    if (err) {
        console.log('DB Error loading all locations');
    res.redirect('/');
} else {
    var num = 0;
    console.log("Beginning finding all passages");
    locations.forEach(function (location) {
    num++;
    console.log("Looking up a location");
    Passage.find({"placekey": location.properties.placekey}, function (err, passages) {
        if (err) {
            console.log('DB Error finding passage for: ' + location.properties.placekey);
        } else {
            console.log("Passage was found!");
            location.properties.passages = passages[0]; //take first passage
            num--;
        }
        if (num === 0) {
            console.log("All passages were found!");
            var featureCollection = {
                "type": "FeatureCollection",
                "features": locations
            };
            console.log(featureCollection);
            console.log(featureCollection.features[0].properties);
            console.log(featureCollection.features[0].properties.passages);
            res.json(featureCollection);
            console.log("JSON sent over!");
        }
    });
});

featureCollection をログに記録すると、一節なしで featureCollection が取得されます。

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "num_books": 62,
        "Age": "Built 1078",
        "ID": "",
        "num_mentions": 325,
        "Place": "The Tower",
        "placekey": "TheTower",
        "GeocodeNotes": "",
        "Notes": "Built on the site of Roman fortifications, the central part of the Tower, known as the White Tower, was built in 1078 by William the Conqueror. Subsequent rings of fortification were added later. It was used as a royal residence as well as a prison and place of execution until Elizabethan times. England's child king, Edward V, and his brother were murdered in the Tower in 1483 supposedly by their uncle, Richard III.",
        "Class": "n/a",
        "Type": "Landmark"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -0.076111,
          51.508056
        ]
      }
    },
   // more objects

パッセージ プロパティはありません。

ただし、console.log(featureCollection.features[0].properties.passages) を使用すると、最初のパッセージが得られます。

 {
  "_id": "51deebdbb2b5de1b8b6d7da1",
  "index": 27100,
  "bookid": 1,
  "author": "Ainsworth, William",
  "place": "The Tower",
  "placekey": "TheTower",
  "query_ok": true,
  "year": 1839,
  "corpus": "Chadwyck",
  "fn": "/Volumes/LilaData1/Plain2/Chadwyck/lilaBookId_00149.txt",
  "context_a": "The course of the carpenter's meditations was here...
  //more features
}

さらに、(featureCollection.features [0] .propertiesのif 'passages')を使用すると、真になります。実際、サーバーから JSON 応答を送信する条件を設定できます。パッセージのない featureCollection が送信されます...

長々とした投稿で申し訳ありませんが、私はこれについて本当に夢中になっています。何か案は?

ありがとうございました!:)

4

2 に答える 2

0

問題は、Document で定義された検査が console.log 操作に干渉していることです。この検査では、ドキュメント インスタンスに追加されたプロパティ (documentinst.prop=1 など) は考慮されません。

問題を解決するには、返されたドキュメントで toJSON を使用してから、返されたオブジェクトにプロパティを添付してください

あなたの場合、

var _locations = [];

locations.forEach(function(_location){ // actual mongoose document

  var location;

  location = _location.toJSON(); // do toJSON on the _location mongoose document

  _locations.push(location); //push this object into the new array _locations

  ....logic for passages...

  //imp - add properties to the location object return from toJSON

  if (num === 0) {
    ...
     var featureCollection = {
            "type": "FeatureCollection",
            "features": _locations // use the new _locations array
      };

    ...
 }

});

于 2013-08-23T21:28:42.980 に答える