Flutter Firebase Cloud 功能无法调用

Posted

技术标签:

【中文标题】Flutter Firebase Cloud 功能无法调用【英文标题】:Flutter Firebase Cloud function can not be called 【发布时间】:2020-07-18 05:24:10 【问题描述】:

当我尝试从 Flutter 调用可调用函数时,我在使用 Firebase Cloud Functions 时遇到错误。

flutter: caught generic exception
flutter: PlatformException(functionsError, Firebase function failed with exception., message: NOT FOUND, code: NOT_FOUND)

这是我尝试使用 cloud_functions 调用云函数的方法:^0.4.2+3

import 'package:cloud_functions/cloud_functions.dart';
      _check(String id) async 
        HttpsCallable callable = CloudFunctions.instance
            .getHttpsCallable(functionName: 'checkUserFavorites');
        try 
          final HttpsCallableResult result = await callable.call(
            <String, dynamic>
              'id': id,
            ,
          );
          print(result.data);
         on CloudFunctionsException catch (e) 
          print('caught firebase functions exception');
          print(e.code);
          print(e.message);
          print(e.details);
         catch (e) 
          print('caught generic exception');
          print(e);
        
      

【问题讨论】:

问题似乎与云功能本身有关。当它们在 region('europe-west1') 或 region('europe-west2') 中运行时,它们会因 PlatformException(3840, The data could not be read because it is not in the correct format., null) 或 PlatformException 而失败(functionsError,Firebase 函数因异常而失败。,消息:未找到,代码:未找到)。不是所有地区都支持可调用函数吗?当不定义区域时,函数按预期运行,没有任何问题或错误。 【参考方案1】:

根据Cloud Functions Location Documentation,您当前运行的区域支持云功能,但并非所有区域都支持。

根据您在 cmets 中分享的内容,我会说您的问题有 3 种情况:

europe-west1:该函数可能已过时,因为您遇到了意外的数据格式错误,这表明它需要与您的默认函数不同的数据/格式。

europe-west2:该功能未部署在该区域,这在错误消息message: NOT FOUND中有所提示。

默认函数(未知区域):这是函数的最新版本,位于不同于europe-west1europe-west2 的区域,它接受调用 使用您发送的格式的数据。

注意:您可以在云功能仪表板上查看当前部署了云功能的区域,如下图示例所示:

另外,我怀疑您使用的默认区域是us-central1,因为根据文档:

默认情况下,函数在us-central1 区域中运行

为解决您的问题,我建议您将该功能的当前版本重新部署到您打算使用的欧洲西部地区。

【讨论】:

如果我不配置默认值,它确实是 us-central1。我的数据库位于 europe-west3。我的所有其他功能都部署到 europe-west1 并且按预期工作。但是,在 europe-west1 中部署可调用函数不起作用。我现在使用了默认的 us-central1 并且它可以工作。让我想知道 europe-west1 是否支持可调用函数。 正如我在答案中评论的那样,europe-west1 被列为支持云功能的区域,所有这些区域都支持所有类型的功能,包括可调用的功能,所以我不会说这是一个问题与地区本身。您是否在该部署中收到任何错误或日志,以便我们进行故障排除? 部署到 europe-west1 时,调用函数时我什至看不到 LOGS。 尝试完全删除该区域中的函数实例并重新部署它。 其实不是地域问题,我只是通过一个简单的解决方案找到了原因,我会在下面的答案中附上代码示例。【参考方案2】:

我也遇到过类似的问题,经过几天的调试和实验,我在研究Cloud Functions Plugin for Flutter的源代码后才找到解决方案。

当您部署 Firebase Cloud 功能时,您可以选择任何偏好区域(越靠近您的应用程序越好)。例如

// using DigitalOcean spaces
exports.generateCloudImageUrl = functions
    .region('europe-west3')
    .https.onCall((reqData, context) => 
...

当你想从 Flutter 应用程序调用这个函数时,你必须指定区域,否则全部转到默认的us-central1。请参阅示例代码了解如何使用部署在特定区域中的功能

final HttpsCallable generateCloudImageUrl = new CloudFunctions(region: "europe-west3")
      .getHttpsCallable(functionName: 'generateCloudImageUrl');

// NB! if you initialize with 'CloudFunctions.instance' then this uses 'us-central1' as default region! 

请参阅cloud_function source 了解初始化。

更新,截至recent release,可以如下初始化;

FirebaseFunctions.instanceFor(region: "europe-west3").httpsCallable(
            "generateCloudImageUrl",
            options:
                HttpsCallableOptions(timeout: const Duration(seconds: 30)));

【讨论】:

在我添加 到/web/index.html 截至 2021 年 3 月:Docs 所以你可以初始化为 final FirebaseFunctions _firebaseFunctions = FirebaseFunctions.instanceFor(region: 'europe-west3'); thnx @goldensoju ,刚刚通过您的评论更新了答案。【参考方案3】:

在多个文件中调用正确的函数

短版:使用其父位置调用函数,例如parent-yourFunction

除了有正确的位置,正如上面的答案所暗示的,你还应该确保使用正确的(位置-)名称调用函数(尤其是当你使用this组织方法时):

metrics.js

const functions = require('firebase-functions');
exports.usageStats = functions.https.onRequest((request, response) => 
  // ...
);
exports.nightlyReport = functions.https.onRequest((request, response) => 
  // ...
);

index.js

// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

在颤振中:

HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('metrics-usageStats');

之后,还要确保在调用 firebase emulators:startfirebase serve 时您的函数显示在开头

【讨论】:

以上是关于Flutter Firebase Cloud 功能无法调用的主要内容,如果未能解决你的问题,请参考以下文章

添加 cloud_firebase 包后,我的 Flutter App 没有运行

Flutter 中的 cloud_firestore 和 firebase_auth 兼容性问题

如何在不使用 Firebase Cloud Messaging 控制台的情况下向 Flutter/Firebase Cloud Messaging 上的特定设备发送通知 [重复]

Firebase Cloud Messaging 无法在带有 Flutter 应用程序的 Android 上运行

Firebase Cloud Firestore 在 Flutter 中获取地图数组

如何使用 graphql 从 Firebase 使用 Flutter 从 Cloud Firestore 获取数据?