必须在 Firebase CLI 数据请求中适当处理 Promise

Posted

技术标签:

【中文标题】必须在 Firebase CLI 数据请求中适当处理 Promise【英文标题】:Promises must be handled appropriately in Firebase CLI data request 【发布时间】:2020-09-08 07:56:43 【问题描述】:

在另一个节点中触发了 onCreate 事件后,我试图从一个节点读取数据。然后将来自这些节点的数据发送到 Google 表格。虽然我在构建函数时没有报告错误,但出现了一个部署错误,其中显示了消息“必须正确处理承诺”。这是我的功能:

export const copyAcceptanceToSheet = functions.database.ref('/****/****Id/****').onCreate(async (snapshot, context) => 

    const orderId = snapshot.ref.parent?.key
    const pharmacy = snapshot.val()
    const timeCreated = new Date

    const ****Base = admin.database()
    const acceptRef = ****Base.ref('/*****/'+orderId+'/*****'+pharmacy);

    acceptRef.once('value').then(async function (snapshot2) 
        try
            const price = snapshot2.child('****').val()

            await jwtAuthPromise
            await sheets.spreadsheets.values.append(
            auth: jwtClient,
            spreadsheetId: spreadsheetId,
            range: '****Update!A:D',  // update this range of cells
            valueInputOption: 'RAW',
            requestBody:  values: [[timeCreated, price, pharmacy]]
            , )
        
        catch(error)
            console.log(error)
        

    )

)

错误信息是针对该行的

 acceptRef.once('value').then(async function (snapshot2)
【参考方案1】:

正如documentation 中所解释的,后台函数必须返回一个在所有异步工作完成时解析的承诺。这意味着您必须处理异步工作的 API 调用返回的任何承诺。所有 Firebase API 都是以这种方式异步的。现在,你的函数忽略了once().then().catch() 返回的承诺。简单地在 Promise 上调用 thencatch 并不能完全“处理” Promise - 它们只是附加回调。

由于您使用的是 async/await,因此甚至不需要使用 thencatch。只需awaitonce() 返回的promise 并继续处理结果。

const snapshot2 = await acceptRef.once('value');
const price = snapshot2.child('****').val()
...

【讨论】:

以上是关于必须在 Firebase CLI 数据请求中适当处理 Promise的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数在 Function.MapValues 处返回 RangeError

页面获取数据

firebase 中受保护内容的适当授权规则

在现有 Firebase 项目目录中初始化 firebase CLI 功能

必须打开哪些端口才能与Firebase数据库(而不是FCM消息传递)进行通信?

Firebase 在单个请求中发送多个通知