Javascript Firestore查询不工作
上面显示的是我的firestore系列 我正在尝试使用我已部署的Google Cloud功能从该集合中获取数据: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
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实时数据库的快照并没有实现。我想你已经找到了答案。:-)