Firestore查询无法正常工作

时间:2017-11-26 04:54:49

标签: javascript node.js firebase google-cloud-functions google-cloud-firestore

Firestore

上面显示的是我的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对象:

return object

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

我使用此功能将集合上传到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!')
}

不确定我做错了什么。为什么函数没有返回任何文件?

2 个答案:

答案 0 :(得分:0)

异步从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命令中运行上述命令,而不是在云函数环境中运行,因为后者实际上可能会在加载数据之前终止命令。

以上的输出是:

  

开始之前

     

开始后获取

     

然后()

这可能不是您预期的顺序。但由于数据是从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))
}

答案 1 :(得分:0)

因此在遇到一些问题后,我找到了问题的根源。出于某种原因,如果您在返回对象上使用.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)
     })