上面显示的是我的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!')
}
不确定我做错了什么。为什么函数没有返回任何文件?
答案 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)
})