Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 承诺未定义的Firebase DocumentSnapshot_Node.js_Typescript_Firebase_Google Cloud Firestore - Fatal编程技术网

Node.js 承诺未定义的Firebase DocumentSnapshot

Node.js 承诺未定义的Firebase DocumentSnapshot,node.js,typescript,firebase,google-cloud-firestore,Node.js,Typescript,Firebase,Google Cloud Firestore,我有一个获取文档集合的查询。然后遍历返回文档的集合,查找其他数据。这在forEach循环中完成,将文档添加到返回Promise.all(array)的数组中 从这里,我可以链接另一个,然后(snapshot=>{})以获取从promise返回的数组中的项。然而,问题是,当我调用方法data()来获取一个普通的旧javascript对象时,它总是返回未定义的。不知道如何解决这个问题 以下是Firebase云函数: exports.cloudFunctionApi = functions.https

我有一个获取文档集合的查询。然后遍历返回文档的集合,查找其他数据。这在
forEach
循环中完成,将文档添加到返回
Promise.all(array)
的数组中

从这里,我可以链接另一个
,然后(snapshot=>{})
以获取从promise返回的数组中的项。然而,问题是,当我调用方法
data()
来获取一个普通的旧javascript对象时,它总是返回
未定义的
。不知道如何解决这个问题

以下是Firebase云函数:

exports.cloudFunctionApi = functions.https.onCall(async(data, context) => {
   admin.firestore().collection("myDocuments").get()
   .then(snapshot => {
      const promises = []
      snapshot.forEach(item => {
         if(item.id == "abc123) {
            const data = item.data()
            const p = admin.firestore().doc(`myDocumentDetail/${item.id}`).get()
            promises.push(p)
         }
      })
      return Promise.all(promises)
   })
   .then(snapshot => {
      snapshot.forEach(item => {
         const data = item.data()
         console.log(`data is:  ${data}`)   // undefined, grrr
      })
   })
   .catch(error => {
      console.error(`Error: ${error}`)
   })
})
我在tsconfig.json文件中解析了一些关于
const promises=[]
的愚蠢警告,设置如下:

{
   "compilerOptions": {
      "module": "commonjs",
      "noImplicitReturns": true,
      "noUnusedLocals": true,
      "outDir": "lib",
      "sourceMap": true,
      "target": "es2017",
      "resolveJsonModule": true
    },
    "compileOnSave": true,
    "include": [
       "src"
     ],
     "strictNullChecks":false
}

非常感谢您的帮助,我已经好几天没能解决这个问题了

根据链接的API文档,当返回undefined时,表示感谢,这意味着您使用
get()
请求的文档不存在。因为我们看不到您的数据,或者代码中的任何变量,所以您必须进行一些调试以找出原因


我建议在你的代码中检查
数据。存在
,这样你就可以在调用
数据()
之前找出请求的文档是否存在,或者在尝试对其采取行动之前简单地检查
数据()
的结果。

墨菲定律,一旦你发布了一个问题,你就可以找到答案

tsconfig.json
中,我添加了
“strict”:true
,对于数组的声明,我将代码更改为
const-promises:any[]=[]
。这是我解决“哑错误”的唯一方法,但正如Doug Stevenson所发布的,您也可以使用
const-promises:Promise[]=[]
实现类型安全


接下来,我从集合中删除了文档,并使用相同的文档标识符重新添加了它。果然,我不再看到
未定义的
,而是看到完整的对象表示。耶

您所指的“愚蠢警告”是TypeScript告诉您,您丢失了承诺的类型信息和声明方式。更正警告,即在不禁用严格检查的情况下,将有助于代码的可读性以及代码之后的类型安全性<代码>常量承诺:承诺[]=[]嘿,道格,谢谢你的回复。当我在tsconfig.json文件中添加
“strict”:true时,我得到了我声明的
promises
下面的swiggley行。我很想知道我应该在这里使用什么样的最佳方法\配置。顺便说一句,并非总是这样,我删除了导致
未定义的
的文档,然后重新添加。问题解决了!