Firebase仿真器返回空数据,而在部署后可以正常工作

时间:2020-04-25 14:48:16

标签: firebase google-cloud-firestore google-cloud-functions firebase-cli firebase-tools

我写了一个非常基本的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.

这似乎是在尝试与生产进行通信,但无法发出任何成功的请求。

1 个答案:

答案 0 :(得分:0)

如果它不是在模拟器中运行,而是在部署中运行,则表明您模拟的Firestore没有数据。

尝试以下操作:运行Firebase:emulators start --only functions,以使使用中的数据库成为您的生产数据库。 (显然,如果要在此处操作数据,请谨慎行事。)

然后对生产数据库运行仿真功能。如果获得所需的数据,则可能是您的模拟Firestore造成了问题。

我个人发现,对我来说,使用仿真功能但使用非仿真火库是最佳的测试流程,其中我创建了生产数据库的重复部分以进行测试。这仍然允许诸如热重装之类的细节,但是我发现模仿生产的行为更加紧密且可预测。 然后,根据您是否在仿真,可以使这些功能智能地指向数据库的相应部分。