Javascript对象 – 从整体对象缺less的function,但存在

奇怪的问题在这里。 我正在运行Node / Express / Mongoose / Leaflet。 我从我的数据库中拉出一个位置数组,一旦callback启动,我遍历这些位置,以find一堆string通道,处理每个位置。 然后,我尝试追加到每个位置对象的段落数组,然后将位置数组附加到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!"); } }); }); 

loggingfeatureCollection让我的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中的'段落')给我的真实。 事实上,我可以条件从服务器发送一个JSON响应,我的featureCollection没有段落将被发送…

对不起,这个冗长的post,但我真的疯了。 有任何想法吗?

谢谢! 🙂

问题是在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 }; ... } 

});

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

如果obj必须定义JSON,则从调用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);