【问题标题】:How do l return the token from a field value in a Cloud Functions?如何从 Cloud Functions 中的字段值返回令牌?
【发布时间】:2021-07-17 14:20:04
【问题描述】:

我收到此错误: 提供给 sendToDevice() 的注册令牌必须是非空字符串或非空数组。 在 FirebaseMessagingError.FirebaseError [作为构造函数] (/workspace/node_modules/firebase-admin/lib/utils/error.js:44:28)

exports.mediZim = functions.firestore.document("users/{user}/responses/{pharmacy}")
    .onCreate((change, context) => {
        const myData = change.data();
        const tokens = [];
        fstore.collection("pharmacies").doc(myData.uid).collection("userTokens").get().then((snap) => {
            return snap.forEach((element) => {
                tokens.push(element.data().token);
            });
        });
        return fcm.sendToDevice(tokens, {
            data: {
                title: "Medi-Zim",
                body: change.data().message,
                sound: "default",
            },
        });
    });

在“users/{user}/responses/{pharmacy}”我有这个 Firestore Field uid available

我使用 uid 来获取另一个集合中的文档 ID,以便我可以获取输入到该文档的用户令牌。 l 然后send想要发送通知给tokens。 Error with eslint after trying answers 1 and 2 Another Try From answer 1

这是我从 Cloud Functions 得到的错误:

提供给 sendToDevice() 的注册令牌必须是非空字符串或非空数组。 在 FirebaseMessagingError.FirebaseError [作为构造函数] (/workspace/node_modules/firebase-admin/lib/utils/error.js:44:28)

【问题讨论】:

  • 可以试试加console.log(tokens.length)看看数组是否为空吗?
  • @Dharmaraj 现在部署将很快回复您
  • @Dharmaraj Firebase 日志中没有显示任何内容
  • 我已经发布了答案。有几个问题。请让我知道这是否有效。如果确实如此,那么您可以通过单击复选图标接受它,以便其他人知道问题已解决。否则,请分享更多疑问。
  • @Dharmaraj 我刚刚尝试了你的代码,lint 给了我以下错误,错误解析错误:意外令牌 => 这是在这一行 .onCreate(async (change, context) => {

标签: javascript firebase google-cloud-firestore google-cloud-functions firebase-cloud-messaging


【解决方案1】:

这里的问题不在于令牌,而在于async 代码。

试试这样的代码:

exports.mediZim = functions.firestore
  .document("users/{user}/responses/{pharmacy}")
  .onCreate((change, context) => {
    const myData = change.data();

    return fstore
      .collection("pharmacies")
      .doc(myData.uid)
      .collection("userTokens")
      .get()
      .then((snap) => {
        const tokens = [];

        snap.forEach((element) => {
          tokens.push(element.data().token);
        });

        return fcm.sendToDevice(tokens, {
          data: {
            title: "Medi-Zim",
            body: change.data().message,
            sound: "default",
          },
        });
      });
  });

您的代码的问题是您返回了fcm.sendToDevice,而没有等待get 调用完成。所以你总是将通知发送到一个空数组并得到那个错误。

【讨论】:

  • 也从lint 得到错误:error Parsing error: Unexpected token => 与@Dharmaraj 相同的行是.onCreate(async (change, context) => {
  • 你的代币是如何存储在数据库中的?错误只是说没有字段token
  • 文档中的字段值作为字符串
  • 当我使用 onCreate 函数执行 async await 时,eslint 现在告诉我它有 error Parsing error: Unexpected token => 这意味着该行存在语法错误
  • 我已经更新了代码,所以它不使用异步等待,但带有错误修复的旧样式可以正常工作。
【解决方案2】:

return 语句在循环完成并且标记在数组中之前执行。

请尝试下面完全相同的代码,如果它有效,请告诉我。

exports.mediZim = functions.firestore.document("users/{user}/responses/{pharmacy}")
    .onCreate(async (change, context) => {
        const myData = change.data();
        const tokens = [];
        const tokenDocs = await fstore.collection("pharmacies").doc(myData.uid).collection("userTokens").get()
        tokenDocs.docs.forEach((doc) => {
            tokens.push(doc.data().token);
        });
        return fcm.sendToDevice(tokens, {
            data: {
                title: "Medi-Zim",
                body: change.data().message,
                sound: "default",
            },
        });
    });

我使用了async-await 而不是链接承诺。这现在应该等待 Firestore 的响应,然后返回 FCM 函数。

【讨论】:

  • 我们的答案几乎相同;) 您在 get 电话中缺少await
  • @TarikHuber 谢谢 :D 我错过了复制原始代码的文件:')
  • 检查中请稍候...我将添加等待
  • 同样的错误错误Parsing error: Unexpected token =>
  • @PardonJuru 尝试正常功能.. ..onCreate(async function (change, context) { . . .})
猜你喜欢
  • 2019-03-02
  • 2021-07-10
  • 2021-07-13
  • 2020-10-17
  • 2021-05-09
  • 2017-08-27
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多