Dart 函数框架的使用

ven*_*nir 6 dart google-cloud-functions google-cloud-run functions-framework

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

我已经运行了快速启动,并且已经阅读了文档中的所有内容。

快速入门一次只提到一个函数(例如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!');
}
Run Code Online (Sandbox Code Playgroud)

但正如您在快速入门中看到的那样,项目中一次仅处理一个功能。我想部署多个功能怎么样?我是不是该:

  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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

有区别和/或最佳实践吗?提前致谢。

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

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

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

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

aar*_*gas 2

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

  • 您只能拥有一个提供的功能。它应该被命名为“function”(类型和名称可以被覆盖,请参阅cloudevent示例dartfn generate cloudevent
  • 您“可以”部署其中许多这样的组件,以便每个组件都执行特定的操作,例如处理上面的 cloudevents,但大多数人想要更像 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);
Run Code Online (Sandbox Code Playgroud)