Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 必须在Firebase CLI数据请求中适当处理承诺_Javascript_Firebase Realtime Database_Promise_Google Cloud Functions_Firebase Cli - Fatal编程技术网

Javascript 必须在Firebase CLI数据请求中适当处理承诺

Javascript 必须在Firebase CLI数据请求中适当处理承诺,javascript,firebase-realtime-database,promise,google-cloud-functions,firebase-cli,Javascript,Firebase Realtime Database,Promise,Google Cloud Functions,Firebase Cli,在另一个节点中触发onCreate事件后,我正在尝试从节点读取数据。然后,来自这些节点的数据将被发送到Google工作表。虽然在我构建函数时没有报告错误,但是出现了一个部署错误,其中显示了消息“承诺必须得到适当处理”。以下是我的功能: export const copyAcceptanceToSheet = functions.database.ref('/****/{****Id}/****').onCreate(async (snapshot, context) => { c

在另一个节点中触发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)
如中所述,后台函数必须返回一个承诺,该承诺在所有异步工作完成时解析。这意味着您必须处理异步工作的API调用返回的任何承诺。所有Firebase API都是以这种方式异步的。现在,您的函数忽略了
once().then().catch()
返回的承诺。简单地调用允诺上的
then
catch
并不能完全“处理”允诺-它们只是附加回调

因为您使用的是async/await,所以甚至不需要使用
then
catch
。只需等待
返回的承诺一次()
并继续处理结果

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

您的
onCreate
回调是
async
,但您从不等待任何东西。您是想
等待
(或
返回
)acceptRef.once('value')承诺吗?这是一个错误。我最初在acceptRef.one('value')之外调用sheets.spreadsheets.values.append。忘记删除onCreate中的异步。编辑了代码后,错误消息将继续添加一条注释,以便将来有人引用此问题。async必须附加到onCreate。因此,我放置的原始代码被恢复