Javascript 用于循环异步等待的Firebase函数

Javascript 用于循环异步等待的Firebase函数,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我试图用Firebase函数做一个理论上相对简单的函数 具体而言: 向所有用户的实时数据库变量添加+1 向所有用户发送通知 我仍在试图理解async/await,这可能就是为什么我在这方面如此努力的原因 以下是我正在做的: exports.gcIncrement = functions.database .ref('gthreads/{threadId}/messages/{messageId}') .onCreate(async (snapshot, context) => {

我试图用Firebase函数做一个理论上相对简单的函数

具体而言:

向所有用户的实时数据库变量添加+1

向所有用户发送通知

我仍在试图理解async/await,这可能就是为什么我在这方面如此努力的原因

以下是我正在做的:

 exports.gcIncrement = functions.database
  .ref('gthreads/{threadId}/messages/{messageId}')
  .onCreate(async (snapshot, context) => {

    const data = snapshot.val();
    const threadId = context.params.threadId;
    const uid = context.auth.uid;
    
    adb.ref('gchats/' + threadId).once('value').then(async (gchatData) => {
    const parent = gchatData.val();
    incrementUser(parent.users, uid, threadId); //parent.users is an object with 1-30 users.
    sendGCNotification(parent.users, data);
    return true;
  }).catch(error => console.log(error))
});
然后我有一个函数incrementUser:

以及函数sendGCNotification:

我当前得到的错误是:

“await”表达式仅允许在异步函数中使用

const devices=等待设备ref.get

但即使我没有出错,它似乎也不起作用。Firebase功能日志显示:

下午4:45:26.207 GCC增量 函数执行耗时444毫秒,状态为“ok” 下午4:45:25.763 GCC增量 函数执行已开始

因此,它似乎按预期运行,但没有按预期完成代码。有什么想法吗?谢谢大家!

wait的所有用法都必须发生在标记为async的函数的主体中。您的函数sendGCNotification不是异步的。您必须将其标记为async,并确保其中的任何承诺都已等待,或者返回一个承诺,该承诺在所有异步工作完成后解析

此外,在IncrementUser中,您没有处理gcMessageRef.transaction返回的承诺。您需要处理从所有异步工作生成的每个承诺,并确保它们都是您从顶级函数返回或等待的最终承诺的一部分

如果您想了解更多关于云函数代码中的承诺和异步/等待,我建议您使用我的。具体来说,标题为async/await如何与TypeScript和ECMAScript 2017一起工作?。即使您不使用TypeScript,async/await也会以同样的方式工作

function IncrementUser(array, uid, threadId) {
    for (const key in array) {
      if (key != uid) {
        const gcMessageRef =
        adb.ref('users/' + key + '/gthreads/' + threadId + '/' + threadId+'/unread/');
        gcMessageRef.transaction((int) => {
          return (int || 0) + 1;
      }
    }
  }
  function sendGCNotification(array, numbOfMsg, data) {
    let payload = {
      notification: {
        title: 'My App - ' + data.title,
        body: "This is a new notification!",
      }
    }
    const db = admin.firestore()
    for (const key in array) {
      if (!data.adminMessage) {
        if (array[key] === 0) {

          const devicesRef = db.collection('devices').where('userId', '==', key)

          const devices = await devicesRef.get();
          devices.forEach(result => {
            const tokens = [];
            const token = result.data().token;
            tokens.push(token)

            return admin.messaging().sendToDevice(tokens, payload)
          })

        }
      }
    }
  }