Javascript Firestore查询不工作

Javascript Firestore查询不工作,javascript,node.js,firebase,google-cloud-functions,google-cloud-firestore,Javascript,Node.js,Firebase,Google Cloud Functions,Google Cloud Firestore,上面显示的是我的firestore系列 我正在尝试使用我已部署的Google Cloud功能从该集合中获取数据: const admin = require('firebase-admin') const functions = require('firebase-functions') module.exports= function(request, response){ let results = [] admin.firestore().collectio

上面显示的是我的firestore系列

我正在尝试使用我已部署的Google Cloud功能从该集合中获取数据:

const admin = require('firebase-admin')
const functions = require('firebase-functions')

module.exports=  function(request, response){ 
     let results = []   
     admin.firestore().collection('news_stories')
     .get()
     .then(docs => docs.map(doc => results.push(doc.data())))
     .catch(e => resoponse.status(400).send(e))

      response.status(200).send(results)
}
当我运行上述函数时,我得到一个:

错误:无法处理该请求

我还试着以这种方式运行函数,看看它是否可以工作

  module.exports=  function(request, response){ 
     let ref = admin.firestore().collection('news_stories')
     .get()
     .then(docs =>   response.status(200).send(docs))
     .catch(e => resoponse.status(400).send(e))
}
此函数返回了一个JSON对象:

没有关于数据或任何文档的信息

我使用以下功能将集合上载到firestore DB:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

module.exports = function(request,response){
   if(!request.body.data){
      response.status(422).send({error: 'missing data'})
   }
   let data = request.body.data
   data.map(item => { 
      admin.firestore().collection('news_stories').add({item})
      })
     response.status(200).send('success!')
}

不知道我做错了什么。为什么函数不返回任何文档?

从Firestore异步检索数据。当您将响应发送回调用方时,结果尚未从Firestore检索到

用三条日志语句替换大部分代码最容易看出这一点:

console.log("Before starting get");
admin.firestore().collection('news_stories')
  .get()
  .then(() => {
    console.log("In then()");
  });
console.log("After starting get");
最好是在常规的node.js命令中运行上述命令,而不是在云函数环境中运行,因为后者实际上可能会在加载数据之前终止该命令

上面的输出是:

在开始之前

开始后得到

在then()中

这可能不是您期望的顺序。但由于数据是从Firestore异步加载的,因此回调函数后的代码可以直接继续。然后,当数据从Firestore返回时,您的回调将被调用,并且可以根据需要使用数据

解决方案是将需要数据的所有代码移动到
then()处理程序中:

const admin = require('firebase-admin')
const functions = require('firebase-functions')

module.exports=  function(request, response){ 
     admin.firestore().collection('news_stories')
     .get()
     .then(docs => {
       let results = []   
       docs.map(doc => results.push(doc.data()))
       response.status(200).send(results)
     })
     .catch(e => resoponse.status(400).send(e))
}

从Firestore异步检索数据。当您将响应发送回调用方时,结果尚未从Firestore检索到

用三条日志语句替换大部分代码最容易看出这一点:

console.log("Before starting get");
admin.firestore().collection('news_stories')
  .get()
  .then(() => {
    console.log("In then()");
  });
console.log("After starting get");
最好是在常规的node.js命令中运行上述命令,而不是在云函数环境中运行,因为后者实际上可能会在加载数据之前终止该命令

上面的输出是:

在开始之前

开始后得到

在then()中

这可能不是您期望的顺序。但由于数据是从Firestore异步加载的,因此回调函数后的代码可以直接继续。然后,当数据从Firestore返回时,您的回调将被调用,并且可以根据需要使用数据

解决方案是将需要数据的所有代码移动到
then()处理程序中:

const admin = require('firebase-admin')
const functions = require('firebase-functions')

module.exports=  function(request, response){ 
     admin.firestore().collection('news_stories')
     .get()
     .then(docs => {
       let results = []   
       docs.map(doc => results.push(doc.data()))
       response.status(200).send(results)
     })
     .catch(e => resoponse.status(400).send(e))
}

所以,经过一些故障排除,我找到了问题的根源。出于某种原因,如果在返回对象上使用.map,服务器将以500状态响应。。。 将.map更改为forEach,该函数将正常工作

这会有用的

  admin.firestore().collection('news_stories')
    .get()
    .then(docs => {
        let data = []
        docs.forEach(doc => data.push(doc.data()))
       response.status(200).send(data)
  })
然而这不会

    admin.firestore().collection('news_stories')
      .get()
       .then(docs => {
         let data = []
         docs.map(doc => data.push(doc.data()))
         response.status(200).send(data)
     })

所以,经过一些故障排除,我找到了问题的根源。出于某种原因,如果在返回对象上使用.map,服务器将以500状态响应。。。 将.map更改为forEach,该函数将正常工作

这会有用的

  admin.firestore().collection('news_stories')
    .get()
    .then(docs => {
        let data = []
        docs.forEach(doc => data.push(doc.data()))
       response.status(200).send(data)
  })
然而这不会

    admin.firestore().collection('news_stories')
      .get()
       .then(docs => {
         let data = []
         docs.map(doc => data.push(doc.data()))
         response.status(200).send(data)
     })

感谢您的时间和帮助,我已经对代码进行了编辑,不幸的是,它仍然无法在Node.js环境或云中工作。。。我不断得到一个500状态的错误代码…这肯定是你现有代码中的一个错误。可能还有更多。我让云功能开始工作了。。。错误源在.map函数中。。。一旦我改变了。映射到forEach,函数就会运行,数据也会返回,听上去很好。实际上,我想知道Firestore的快照是否实现了映射,因为Firebase实时数据库的快照并没有实现。我想你已经找到了答案。:-)感谢您的时间和帮助,我已经对代码进行了编辑,不幸的是,它仍然无法在Node.js环境或云中工作。。。我不断得到一个500状态的错误代码…这肯定是你现有代码中的一个错误。可能还有更多。我让云功能开始工作了。。。错误源在.map函数中。。。一旦我改变了。映射到forEach,函数就会运行,数据也会返回,听上去很好。实际上,我想知道Firestore的快照是否实现了映射,因为Firebase实时数据库的快照并没有实现。我想你已经找到了答案。:-)