Облачные функции Firebase: undefined не является функцией - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь преобразовать карту в массив с облачными функциями Firebase

Это мой код.

  let map = new Map();
  map.set("1", 1);
  map.set("2", 2);
  console.log(new Array(...map).map(pairs => pairs[0]));

  // Upper code not relevant: just to test, but prints ["1", "2"] in the firebase logs)


  const getUser = await admin.firestore()
  .collection("users")
  .doc(context.auth.uid)
  .get();

  let userMap = getUser.data()['friendsMap'];
  console.log(userMap);

   // Prints this in the firebase logs: { '1234ab': 'Jeff',
  5678ab: 'Bob' }


  let userIDLIST = new Array(...userMap).map(pairs => pairs[0]);

  console.log('userIDLIST:'+userIDLIST);

, когда я хочу преобразовать userMap в массив userIDLIST ( последние строки кода), я получаю сообщение об ошибке:

Unhandled error TypeError: undefined is not a function

Что я делаю не так?

Заранее спасибо!

1 Ответ

1 голос
/ 01 февраля 2020

Трудно точно сказать, в чем заключается ваша проблема, исходя из получаемой ошибки (что на самом деле не имеет смысла! :-)), но, вероятно, это связано с тем, что userMap не является итеративным.

Как вы прочтете в do c (раздел «Только для итераций» внизу страницы):

Синтаксис распространения (отличный от случай свойств распространения) может применяться только к итерируемым объектам.

Вы можете проверить, что userMap не итерируемый с помощью функции, которую вы найдете в следующем SO answer .

Причина в том, что тип карты в Firestore «представляет объект , встроенный в документ» (как объяснено в документации о типах данных) и этот объект на самом деле это не карта stricto sensu , а просто и объект .

Как объяснено на карте do c (раздел "Объекты против карт"):

Объект похож на карту: оба позволяют вам установить ключи к значениям, извлекать эти значения, удалять ключи и определять, хранится ли что-то в ключе. По этой причине (а также потому, что не было встроенных альтернатив), Объекты исторически использовались как Карты.

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

. ....

  • Карта является итеративной, поэтому ее можно итерировать напрямую
  • Итерация по объекту требует некоторого способа получения его ключей и итерации по ним.

Вы можете проверить, что userMap на самом деле не является картой, выполнив

console.log(userMap instanceof Map);   //  -> False

Таким образом, использование Object.entries() должно решить проблему следующим образом:

  const getUser = await admin.firestore()
  .collection("users")
  .doc(context.auth.uid)
  .get();

  const userFriendsMap = getUser.data().friendsMap;
  const userFriendsArray = Object.entries(userMap);

  const userIDLIST = new Array(...userFriendsArray).map(pairs => pairs[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...