В Node.js и JSON.stringify отсутствуют некоторые значения / параметры объекта - PullRequest
5 голосов
/ 10 сентября 2011

Может быть, я не понимаю сценарий javascript / coffee так же хорошо, как я думал, но когда я делаю это:

that.thing = thing
that.thing.title = "some title"
console.log(that.thing.title)
console.log(JSON.stringify(that.thing)

Я получаю вывод:

какой-то заголовок

{"creation_date": "2011-09-09T00: 40: 03.742Z", "_ id": "4e6960638ec80519a0000013"}

Проблема в том, что мне кажется, что свойство title теряется, когдаЯ делаю stringify (и позже, когда функция существует, у меня, похоже, возникают другие интересные проблемы, которые, как я полагаю, связаны с этим и вложенным в несколько вызовов fxn).

(мне пришлось сделатьпока что ужасное решение, где я делаю это .thing = {}, чтобы решить мою проблему. Другие проблемы, которые мне приходилось решать, прежде чем включить node.js + async + mongoose.find, и это все внутри async.findEach)

Когда я делаю

console.log(that.thing.toJSON) 

, я получаю:

function () {return this.toObject ();}

Спасибо.

Ответы [ 3 ]

6 голосов
/ 08 сентября 2013

Это потому, что Model.find () возвращает MongooseDocument.Если вам нужен простой объект JavaScript, к которому вы можете добавить свойства, вам нужно указать опцию «lean»:

Model.find().lean().exec(function (err, thing) {
    thing.title = "some title";
    console.log(JSON.stringify(thing));
});

Это будет работать нормально, если вам не нужно сохранять объект вещьснова (так как это не MongooseDocument, не применяются геттеры и сеттеры).

3 голосов
/ 10 сентября 2011

Поскольку вы упомянули мангуста, возможно, that.thing - это особый объект с некоторыми специфическими свойствами.

На это могут повлиять две вещи.

Либо thingна самом деле метод получения / установки с какой-то ужасной логикой

Или, более вероятно, thing имеет метод .toJSON, который записывает объект в json, и вы не добавили или не удалили этот метод, чтобы заставить JSON.stringify работать.

По умолчанию JSON.stringify вызывает метод .toJSON, если он существует.

Так что простой console.log(that.thing.toJSON); должен идентифицировать вашу проблему

В любом случае, кем вы действительно должны бытьделать, когда вы хотите записать данные и убедиться, что они записывают текущие данные в режиме блокировки.

console.warn(util.inspect(that.thing));

1 голос
/ 04 сентября 2013

Вы видите "function () {return this.toObject ();}", потому что toJSON является прототипом функции.

То есть console.log (that.thing.toJSON) напечатает функциюсам, но console.log (that.thing.toJSON ()) напечатает значение, возвращаемое функцией.Добавление дополнительных скобок выполнит функцию.

Попробуйте console.log (that.thing.toJSON ()) и посмотрите, получите ли вы то, что ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...