当前位置: 首页 > 知识库问答 >
问题:

如何从云函数中的字段值返回令牌?

汝墨一
2023-03-14

我收到这个错误:提供给sendToDevice()的注册令牌必须是一个非空字符串或非空数组。在Firebase MessagingError。Firebase Error[作为构造函数](/workspace/node_modules/fire base-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字段uid可用

我使用uid获取另一个集合中的文档ID,这样我就可以获取反馈到该文档的用户令牌。然后我想把通知发给代币。在尝试答案1和答案2后出现eslint错误,请从答案1再试一次

这是我从云函数中得到的错误:

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

共有2个答案

习华灿
2023-03-14

返回语句在循环完成并且令牌在数组中之前执行。

请尝试下面完全相同的代码,让我知道它是否有效。

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而不是链接promise。现在应该等待Firestore的响应,然后返回FCM函数

富勇军
2023-03-14

这里的问题不是令牌,而是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调用完成。因此,您总是将通知发送到空数组并收到错误。

 类似资料:
  • 我正在尝试从函数返回布尔值。 错误:布尔文字不符合预期的类型单位。 我知道unit是kotlin中的默认返回类型。我将如何将其更改为布尔值。

  • 问题内容: 我想在两个单独的变量中从函数返回两个值。例如: 我希望能够分别使用这些值。当我尝试使用时,它返回,这不是我想要的。 问题答案: 你不能返回两个值,但可以返回并在调用后解压缩它: 在线意味着创建一个元组。你也可以使用括号,例如,但是元组是用逗号创建的,因此括号不是必需的。但是,你可以使用parens来提高代码的可读性或将元组分成多行。这同样适用于。 如果要返回两个以上的值,请考虑使用命名

  • 问题内容: 我在从Node.js中的回调函数返回值时遇到了小麻烦,我将尝试尽可能轻松地解释我的情况。考虑一下我有一个片段,它包含URL,并命中该URL,并提供输出: 我试图将其包装在函数中并返回如下值: 因为在我的Node.js代码中,我有很多语句将决定value的值,例如: 关键是a内的所有语句将保持相同,除了的值。因此,绝对需要将这些通用代码放入函数中。我尝试了同样的方法,但是in总是会回报我

  • 问题内容: 我正在尝试返回我从调用请求中的方法获取的值,有没有一种方法可以使我从重写的方法中获取该值?这是我的代码: 我无法获取值,因为要能够在方法中使用它,我需要将其声明为final,而我无法给它赋值。 问题答案: 问题是您试图同步返回的值,但是它是使用回调的异步方法,因此您无法做到这一点。您有2个选择: 您可以更改方法以接受回调,然后将回调链接到该方法。这类似于在rxJava之类的框架中进行映

  • 我正在等待(从USSD请求中)检索一个值,以便返回它(getUSSD):

  • 本文向大家介绍PHP 如何从函数返回两个值,包括了PHP 如何从函数返回两个值的使用技巧和注意事项,需要的朋友参考一下 无法明确返回两个变量,可以将它们放入列表/数组数据结构中并返回。 示例 输出结果 这将产生以下输出-