Firebase云函数:undefined不是函数

时间:2020-02-01 10:01:45

标签: typescript firebase google-cloud-firestore google-cloud-functions

我正在尝试将地图转换为具有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 个答案:

答案 0 :(得分:1)

根据您得到的错误很难说出问题是什么(这不是很有意义!:-)),但这很可能是由于userMap不是可迭代的事实引起的。 / p>

您将在doc中阅读(页面底部的“仅适用于迭代”):

传播语法(对于传播属性而言除外)只能应用于可迭代对象。

您可以使用下面的SO answer中的函数来检查userMap是否可迭代。

原因是Firestore中的Map类型“代表嵌入在文档中的对象”(如数据类型的documentation中所述),而该对象实际上不是{ {3}} stricto sensu ,但简单一个Map

如地图Object中所述(“对象与地图”部分):

对象类似于Map:两者都允许您将键设置为值,并进行检索 这些值,删除键,并检测是否有东西存储在 键。由于这个原因(并且因为没有内置 替代方案),对象在历史上一直被用作地图。

但是,有一些重要的差异使Map在 某些情况:

.....

  • 地图是可迭代的,因此可以直接对其进行迭代
  • 迭代对象需要以某种方式获取其密钥并对其进行迭代。

您可以通过执行以下操作来检查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]);