JSON Stringify игнорирует вложенные объекты при публикации Redis - PullRequest
2 голосов
/ 29 мая 2019

Я использую Redis в своем бэкэнде для масштабирования подписок.Я использую эту библиотеку для реализации redis поверх моего кода JavaScript.И используя мангуста для моделей.

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

Итак, если мой объект такой:

{ subtitle: '',
   description: '',
   checklists:
    [ { _id: 5cee450c0fa29d0b54275da0, items: [] },
      { _id: 5cee455c0c31785b0875e09d, items: [] },
      { _id: 5cee47dc6d32e72c6411ce2d, items: [] } ],
   attachments: [],
   labels: [],
   _id: 5ced1af26547233798f943f6,
   title: 'asfasf',
   box: 5cece1c3e6c3c13ff098658d,
   workflow: 5cece1cbe6c3c13ff0986591,
}

Я получаю:

{ cardUpdated:
    { 
      subtitle: '',
      description: '',
      checklists: [ [Object], [Object], [Object] ],
      attachments: [],
      labels: [],
      _id: '5ced1af26547233798f943f6',
      title: 'asfasf',
      box: '5cece1c3e6c3c13ff098658d',
      workflow: '5cece1cbe6c3c13ff0986591',
    } 
}

Когда я публикую, я использую следующую строку:

pub.publish(types.CARD_UPDATED,
          JSON.stringify(
            { cardUpdated: await getUpdatedCardStats(checklist.card) },
          ));

Примечание: я знаю, что я обертываю аргумент для stringify в {}, и без него вложенные объекты не будут игнорироваться, но я должен сделать это, потому что мне нужно имя свойства ключа в конце подписки, т.е. я используюэта команда публикации с разными именами ключей в нескольких местах.

Есть ли способ для этого, чтобы получить вложенные объекты stringify-ed?

РЕДАКТИРОВАТЬ: Оказывается, я получил правильный полный объект в виде строки на конце подписки Redis, но на самом деле это был JSON.parse(), который был виновником.После разбора он полностью игнорирует вложенные объекты.Есть ли способ избежать этого?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Попробуйте:

const value = JSON.stringify({
    cardUpdated: await getUpdatedCardStats(checklist.card)
});
pub.publish(types.CARD_UPDATED, value);
0 голосов
/ 29 мая 2019

Это не допустимый объект JS:

{ _id: 5cee450c0fa29d0b54275da0, items: [] }

Я думаю, что это вывод .toString() объекта типа {_id: ObjectId, items: any[], с ObjectId, определенным здесь . В любом случае JSONification этого объекта не является тривиальным, и поэтому JSON.stringify просто выводит [Object].

Чтобы обойти это ограничение, вы можете реализовать пользовательскую функцию для преобразования вашего объекта в функцию, которая может быть тривиально JSONified, возможно, с помощью ObjectId.toString () .

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