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
}

此外,使用 (if 'passages' in featureCollection.features[0].properties) 给了我真实的感觉。事实上,我可以有条件地从服务器发送一个 JSON 响应,并且我的 featureCollection 没有段落将被发送......

很抱歉这篇冗长的帖子,但我真的为此发疯了。有任何想法吗?

谢谢!:)

4

2 回答 2

0

当 res.json(obj) 被调用时,这个方法做的第一件事就是调用 JSON.stringify(obj);

如果 obj 已定义 toJSON,则从调用 obj.toJSON() 返回的对象由 JSON.stringify 使用。

如果您在一个对象上提供了一个 toJSON 方法,并且如果它被编码为返回另一个对象而不是定义了 toJSON 的对象,则 JSON.stringify 将对这个新对象进行操作。您将能够查看这个新对象的属性,而不是实际对象。

res.json 依赖于 toJSON。

console.log 依赖于检查。

我刚刚用这段代码片段演示了上面的内容,

var util = require('util');

function Document(){this._doc = {};}

Document.prototype.inspect = function(){return util.inspect(this._doc)};
Document.prototype.toJSON = function(){return this.inspect()};

var docInst = new Document();

docInst.newProp = 'abc'; //property never shows up in console.log / JSON.stringify

docInst._doc._newProp = "_abc";

console.log(docInst);
JSON.stringify(docInst);
于 2013-08-24T03:59:06.940 回答
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 回答