Firebase模拟器返回空数据,但在部署后工作正常



我编写了一个非常基本的API,它将返回服务。我试图在模拟器中运行这个API,但它返回空数据

{
"status": "success",
"statusCode": 200,
"message": "Services retrieved",
"data": []
}

我已经设置了firestore,函数和数据库模拟器。我正在使用

"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.0"

知道为什么数据响应是空的吗?

编辑

这是我调用服务的方法

export const activeServices = functions.https.onRequest((request, response) => {
let services = new Array<string>();
admin.firestore().collection(newServices).get()
.then(serviceSnapshot => {
serviceSnapshot.docs.forEach(doc => {
if(doc.data().service_active){
services.push(doc.data().service_name)
}
})
const successResponse = common.success("success", 200, "Services retrieved", services)
response.send(successResponse)
})
.catch(error => {
const errorResponse = common.error("fail", 500, "Failed to get active services")
console.error(errorResponse)
response.send(errorResponse)
})
})

我试图执行这个,但它什么也不返回,并且在部署后执行了相同的功能。我得到了回应。从下面的回答中,我认为只运行函数将尝试与生产数据库通信。

firebase emulators:start --only functions
functions: The Cloud Firestore emulator is not running, so calls to Firestore will affect production.
⚠  External network resource requested!
- URL: "http://xxx.xxx.xxx.xxx/computeMetadata/v1/instance"
- Be careful, this may be a production service.
⚠  External network resource requested!
- URL: "http://metadata.google.internal./computeMetadata/v1/instance"
- Be careful, this may be a production service.

这看起来像是它试图与生产部门沟通,但无法提出任何成功的请求。

如果它不在模拟器中工作,但在部署中工作,则表明模拟的firestore没有数据。

请尝试以下操作:运行Firebase:emulators start --only functions,以便使用的数据库是您的生产数据库。(显然,如果你要操纵那里的数据,要谨慎行事。(

然后针对生产数据库运行模拟函数。如果你得到了你想要的数据,问题可能是你的模拟消防仓库。

就我个人而言,我发现使用模拟的函数但非模拟的firestore是对我来说最好的测试流程,在那里我创建了生产数据库的重复部分以用于测试。这仍然允许像热重新加载这样的细节,但我发现这种行为可以更接近和可预测地模拟生产。然后,您可以让函数智能地指向数据库的适当部分,这取决于您是否在模拟。

我在这个问题上被困了几个小时。部署的消防仓库运行良好,但模拟的消防仓库总是给出空的响应。

事实证明,我在模拟的消防仓库中错误地植入了数据。在我修复后,一切都很好,所以请确保你的数据在模拟器中是好的。

我只是不喜欢使用production firestore进行测试/调试的想法。是的,你可以"在生产数据库中创建一个用于测试的重复部分";但复制所有这些数据是有代价的。你最好节省你的美元,并使用firestore模拟器。

相关内容

  • 没有找到相关文章