【问题标题】:Dart Functions Framework usageDart 函数框架使用
【发布时间】:2021-10-29 01:18:43
【问题描述】:

我是 Dart 函数框架的新手。我的目标是使用这个包创建几个函数并将它们部署到 Cloud Run(结合 Firebase,但我想这与这个问题无关)。

我已经运行了快速入门并阅读了docs 中的所有内容。

快速入门一次只提及一个函数(例如Hello WorldCloud Events 等),如下所示:

import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';

@CloudFunction()
Response function(Request request) {
    return Response.ok('Hello, World!');
}

但正如您在快速入门中看到的那样,一次在一个项目中只处理一个 一个 函数。我想部署几个功能怎么样?我应该:

  1. 在同一个项目/文件中编写多个函数,让函数框架自己编译'server.dart`

  1. 为每个函数创建一个不同的functions_framework

让我更具体一点。我应该执行以下操作(选项 1 - 这对我来说更有意义):

import 'dart:math';

import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';

@CloudFunction()
Response function(Request request) {
    return Response.ok('Hello, World!');
}

@CloudFunction()
Response function2(Request request) {
  if (Random().nextBool()) {
    return Response.ok('Hello, World!');
  } else {
    return Response.internalServerError();
  }
}

或者我应该通过为我的项目中需要的 each 函数运行 build_runner 来构建不同的文件夹?

是否有区别和/或最佳做法? 提前致谢。

编辑。 这个问题与 Cloud Run 本身的部署有关,而不仅仅是在我自己的 PC 上进行测试。为了测试我自己的功能,我做了以下操作:

  1. 运行dart run build_runner build,以便它正确更新server.dart 文件(我可以看到框架在幕后做了很多工作,_nameToFunctionTarget 基本上是一个路由器);
  2. 在两个不同的终端中运行服务器,如下所示:dart run bin/server.dart --port MYPORT --target MYFUNCTION(其中MYPORTMYFUNCTION 分别是8080/8081function/function2)。

我想我只是对在 Cloud Run 上部署后如何正确管理此框架感到困惑。

编辑 2. 我刚刚放弃了将 Dart 用作无服务器语言甚至后端语言。即使是基本的东西也有太多的行话。任何后端框架要么死了,要么由一个狂热的人维护(对他的支持!)。这种语言还没有得到谷歌团队/社区的足够喜爱,目前基本上不可能在 Dart 上实现全栈。这是一个梦想,但现在无法实现。此外,Dart 几乎没有合适的 SDK 来使用 Firestore 等,所以 Firebase 不是一个选择。我发现学习 NodeJS 并利用 Firebase 对用 NodeJS 编写的 Firebase 函数的支持更容易,如果将来有更多支持,我会等待那里的支持。

【问题讨论】:

    标签: dart google-cloud-functions google-cloud-run functions-framework


    【解决方案1】:

    文档现在有点稀疏(我也是新手!我找不到任何好的例子,所以这里......)

    • 您只能提供一个函数。它应该是 命名为'function'(类型和名称可以被覆盖,请参阅 cloudevent 示例dartfn generate cloudevent)
    • 您“可以”部署其中的许多,以便每个都执行特定的操作,例如处理上面的云事件,但大多数人 想要更像 REST 的东西(见下文)
    • 您需要附加一个Router(),以便您可以让代码中的特定逻辑处理单个入口点(函数)。

    休息示例

    1. 添加到 pubspec.yaml(在依赖项中:)shelf_router: ^1.1.2
    2. 委派@CloudFunction 使用Router()

    functions.dart

    import 'package:functions_framework/functions_framework.dart';
    import 'package:shelf/shelf.dart';
    import 'package:shelf_router/shelf_router.dart';
    
    Router app = Router()
      ..get('/health', (Request request) {
        return Response.ok('healthy');
      })
      ..get('/user/<user>', (Request request, String user) {
        // fetch the user... (probably return as json)
        return Response.ok('hello $user');
      })
      ..post('/user', (Request request) {
        // convert request body to json and persist... (probably return as json)
        return Response.ok('saved the user');
      });
    
    @CloudFunction()
    Future<Response> function(Request request) => app.call(request);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多