Javascript Firebase云功能“;函数返回未定义的预期承诺或值“;

Javascript Firebase云功能“;函数返回未定义的预期承诺或值“;,javascript,firebase,google-cloud-functions,es6-promise,Javascript,Firebase,Google Cloud Functions,Es6 Promise,我试图在添加新消息时通过Firebase云函数向组中的每个成员发送推送通知。我不习惯使用承诺,需要一些帮助 exports.sendPushFromMessage = functions.database.ref('chats/{groupId}/messages/{msgId}').onCreate((snap, context) => { const groupId = context.params.groupId; const users = []; cons

我试图在添加新消息时通过Firebase云函数向组中的每个成员发送推送通知。我不习惯使用承诺,需要一些帮助

exports.sendPushFromMessage = functions.database.ref('chats/{groupId}/messages/{msgId}').onCreate((snap, context) => {
    const groupId = context.params.groupId;
    const users = [];
    const msgTitle = 'New Message';
    const msgBody = snap.val().messageText;
    const creator = snap.val().from;
    const root = snap.ref.root;
    let messages = [];
    return root.child(`groups/${groupId}/selected`).once('value', snapshot => {
      snapshot.forEach(user => {
        root.child(`users/${user.val().uid}`).once('value', spanshot => {
          const expoToken = snapshot.val().token;
          const userId = snapshot.val().uid;
          if (expoToken && (creator !== userId)) {
            messages.push({
              "to": expoToken,
              "title": msgTitle,
              "body": msgBody
            });
          }
        })
      })
      return messages;
    }).then(messages => {
      return fetch('https://exp.host/--/api/v2/push/send', {
        method: "POST",
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json"
        },
        body: JSON.stringify(messages)
      })
    }).catch((e) => console.log(e));
  })
在Firebase函数的日志中,我可以看到以下错误:

函数返回了未定义的预期承诺或值

我知道问题可能在于我如何处理承诺。这个问题困扰了我很长一段时间,如果有人能帮助我,那就太棒了

以下是我尝试过的另一种方法:

exports.sendPushFromMessage = functions.database.ref('chats/{groupId}/messages/{msgId}').onCreate((snap, context) => {
    const groupId = context.params.groupId;
    const users = [];
    const msgTitle = 'New Message';
    const msgBody = snap.val().messageText;
    const creator = snap.val().from;
    const root = snap.ref.root;
    root.child(`groups/${groupId}/selected`).once('value', snapshot => {
      let users = [];
      snapshot.forEach(user => {
        const uid = user.val().uid;
        users.push(uid);
        console.log('fotze' + user.val().uid);
      })
      return Promise.all(users);
    })
    .then(users => {
      let messages = [];
      console.log(users);
      users.forEach(user => {
        console.log('fucking bitch: ' + user.toString());
        console.log('bitch!' + user);
        root.child(`users/${user}/`).once('value', snapshot => {
          const expoToken = snapshot.val().token;
          const userId = snapshot.val().uid;
          console.log('cunt' + snapshot.val().token);
          if (expoToken && (creator !== userId)) {
            messages.push({
                "to": expoToken,
                "title": msgTitle,
                "body": msgBody
            })
          } // if
        }); // once
      }); //forEach
      return Promise.all(messages);
    })
    .then(messages => {
      return fetch('https://exp.host/--/api/v2/push/send', {
        method: "POST",
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json"
        },
        body: JSON.stringify(messages)
      })
    }).catch((e) => console.log(e));
  })
请以这种方式进行测试:

exports.sendPushFromMessage = functions.database.ref('chats/{groupId}/messages/{msgId}').onCreate((snap, context) => {
  const groupId = context.params.groupId;
  const users = [];
  const msgTitle = 'New Message';
  const msgBody = snap.val().messageText;
  const creator = snap.val().from;
  const root = snap.ref.root;
  let messages = [];
  const promises = [];
  return root.child(`groups/${groupId}/selected`).once('value', snapshot => {
    snapshot.forEach(user => {
      const promise = root.child(`users/${user.val().uid}`).once('value', snapshot => {
        const expoToken = snapshot.val().token;
        const userId = snapshot.val().uid;
        if (expoToken && (creator !== userId)) {
          messages.push({
            "to": expoToken,
            "title": msgTitle,
            "body": msgBody
          });
        }
      });
      promises.push(promise);
    });
    return Promise.all(promises).then(() => {
      return sendMessages(messages);
    });
  });
});

function sendMessages(messages){
  return new Promise((resolve, reject) => {
    const f = fetch('https://exp.host/--/api/v2/push/send', {
      method: "POST",
      headers: {
        "Accept": "application/json",
        "Content-Type": "application/json"
      },
      body: JSON.stringify(messages)
    });
    f.on("end", () => {
      resolve();
    });
  });
}
请以这种方式进行测试:

exports.sendPushFromMessage = functions.database.ref('chats/{groupId}/messages/{msgId}').onCreate((snap, context) => {
  const groupId = context.params.groupId;
  const users = [];
  const msgTitle = 'New Message';
  const msgBody = snap.val().messageText;
  const creator = snap.val().from;
  const root = snap.ref.root;
  let messages = [];
  const promises = [];
  return root.child(`groups/${groupId}/selected`).once('value', snapshot => {
    snapshot.forEach(user => {
      const promise = root.child(`users/${user.val().uid}`).once('value', snapshot => {
        const expoToken = snapshot.val().token;
        const userId = snapshot.val().uid;
        if (expoToken && (creator !== userId)) {
          messages.push({
            "to": expoToken,
            "title": msgTitle,
            "body": msgBody
          });
        }
      });
      promises.push(promise);
    });
    return Promise.all(promises).then(() => {
      return sendMessages(messages);
    });
  });
});

function sendMessages(messages){
  return new Promise((resolve, reject) => {
    const f = fetch('https://exp.host/--/api/v2/push/send', {
      method: "POST",
      headers: {
        "Accept": "application/json",
        "Content-Type": "application/json"
      },
      body: JSON.stringify(messages)
    });
    f.on("end", () => {
      resolve();
    });
  });
}

你能在fetch函数中共享代码吗?我已经共享了我用于此函数的所有代码。这就是整个fetch函数。您没有注意到对once()的内部调用返回的承诺。因此,我必须在那里做些什么才能使它工作?很抱歉,我对JavaScript的这一部分非常陌生。将承诺收集到一个数组中,然后使用Promise.all()等待它们。这可能不是唯一的问题,但这里肯定出了问题。你能在fetch函数中共享代码吗?我已经共享了我用于此函数的所有代码。这就是整个fetch函数。您没有注意到对once()的内部调用返回的承诺。因此,我必须在那里做些什么才能使它工作?很抱歉,我对JavaScript的这一部分非常陌生。将承诺收集到一个数组中,然后使用Promise.all()等待它们。这可能不是唯一的问题,但这里肯定出了问题。非常感谢您发布此Answare!它正在工作。我真的很感谢你花时间帮助我!您的代码中有一点输入错误,而不是您键入的快照。但是其他一切都很好。很好,修复了错误。非常感谢您发布此Answare!它正在工作。我真的很感谢你花时间帮助我!您的代码中有一点输入错误,而不是您键入的快照。但是其他一切都很好,很好,修正了打字错误