将Firebase功能切换到Gen-2



我刚刚看到我们有第二代云函数,看起来很棒:https://cloud.google.com/functions/docs/2nd-gen/overview

但是我如何将我的第1代功能切换为第2代?我看到我可以创建一个新的功能作为第二代这样:

const functions = require('@google-cloud/functions-framework');
functions.http('helloHttp', (req, res) => {
res.send(`Hello ${req.query.name || req.body.name || 'World'}!`);
});

但是旧函数呢?有没有办法,否则我将不得不一个接一个地删除并重新创建它们?

Cloud Function Gen2仅适用于产品Cloud Functions,而不适用于Firebase函数
Firebase函数使用库firebase-functions,而Cloud函数使用@google-cloud/functions-framework
从Google Cloud控制台,两个功能将显示相同,但如果您尝试在Cloud Function gen1上部署Cloud Function gen2,您将收到以下错误:

Failed to create function, function projects/[PROJECT_NUMBER]/locations/[LOCATION]/functions/[FUNCTION_NAME] already exists under 'Gen 1' environment. Please delete conflicting function first or deploy the function with a different name.

您需要从Firebase函数完全迁移到全新创建的第二代云函数。

到2022年8月9日,当第二代云功能正式可用时,情况可能已经发生了变化,所以我将在TypeScript项目中记录对我有效的东西。

第1代

客户

"firebase":"9.9.3〃;

import { httpsCallable } from "firebase/functions";
import { AddTwoNumbersInputParams, AddTwoNumbersInputResult } from "./util/shared/my-types";
// ...
const addTwoNumbersFuncCallable = httpsCallable<AddTwoNumbersInputParams, AddTwoNumbersInputResult>(
firebaseFunctions,
"addTwoNumbersFunc",
);
const result = await addTwoNumbersFuncCallable({
firstNum: 3,
secondNum: 5
});
console.log("Result", result.data);

服务器

"firebase函数":"3.21.0";

import * as functions from "firebase-functions";
import { AddTwoNumbersInputParams, AddTwoNumbersInputResult } from "./util/shared/my-types";
// ...
export const addTwoNumbersFunc = functions.https.runWith({ memory: "1GB" }).onCall((params: AddTwoNumbersInputParams, ctx): AddTwoNumbersInputResult => {

if (!ctx.auth) {
throw new functions.https.HttpsError("unauthenticated", "You must be logged in to call server-side functions");
}

return { result: params.firstNum + params.secondNum };
}

共享

为了在我的客户端和服务器代码中共享TypeScript接口AddTwoNumbersInputParams和AddTwoNumbersInputResult,我在一个名为my-types.ts的文件中创建了一个指向目录util/shared的符号链接,该目录包含以下定义:

export interface AddTwoNumbersInputParams {
firstNum: number
secondNum: number
}
export interface AddTwoNumbersInputResult {
result: number
}

第二代

客户

"firebase":"9.9.3〃;

import { httpsCallableFromURL } from "firebase/functions"; // see note1, note2, note3 below 
// ...
const addTwoNumbersFuncCallable = httpsCallableFromURL<AddTwoNumbersInputParams, AddTwoNumbersInputResult>(
firebaseFunctions,
"https://addtwonumbersfunc-fri67ycgta-uc.a.run.app",  // see note1, note2, note3 below 
);
const result = await addTwoNumbersFuncCallable({
firstNum: 3,
secondNum: 5
});
console.log("Result", result.data);

注1:可调用文档和http事件文档都说firebase deploy命令应该输出URL,但我没有看到。我通过以下操作获得了它:

  1. Firebase控制台
  2. 单击您的项目
  3. 单击功能(在左侧的目录中,但如果您没有看到,请单击"所有产品",然后单击功能)
  4. 复制触发器列中函数的URL;它的形式应该是https://<lowercase_func_name>-<random-hash>-<region>.a.run.app

note2:起初我担心第二代功能会在我的持续集成管道中引入手动步骤,因为他们现在输出了一个URL(或者说是这样)。有几个Firebase项目代表了不同的生产阶段(谷歌的建议),我想我会有一个新的麻烦来复制和粘贴第二代功能的每次部署的URL。幸运的是,它没有我想象的那么糟糕,因为";URL在部署之后保持稳定";。因此,我只需要部署一次就可以获得URL,将其插入到我的客户端代码中,然后每次部署都保持不变。也就是说,对于我的每个Firebase项目来说,它仍然是一个不同的URL。所以我将不得不做更多的工作来促进生产。但也许他们会解决这个问题,因为他们说";在未来的版本中,第二代函数URL将更新为稳定且具有确定性&";。

注3:我发现URL太复杂了,所以我尝试不使用它,并在Firebase函数模拟器上取得了成功,但在真正的Firebase项目上没有。有了模拟器,我可以继续使用接受函数名称的httpsCallable()函数,而不是需要URL的httpsCallableFromURL()函数。它在模拟器上运行,但没有真正的Firebase项目。

服务器

"firebase函数":"3.21.0";

import * as functionsV2 from "firebase-functions/v2";
import {CallableRequest} from "firebase-functions/lib/common/providers/https";
import {HttpsOptions} from "firebase-functions/lib/v2/providers/https";
// ... 
const httpsOptions: HttpsOptions = {
memory: "16GiB"  // see note4 below
};

// see note5 below
export const addtwonumbersfunc = functionsV2.https.onCall(httpsOptions, (request: CallableRequest<AddTwoNumbersInputParams>): AddTwoNumbersInputResult => {
if (!request.auth) {
throw new functionsV2.https.HttpsError("unauthenticated", "You must be logged in to call server-side functions");
}
return { result: request.data.firstNum + request.data.secondNum };
});

注4:用于设置内存(等)的runWith()语法似乎已更改为HttpsOptions对象,该对象传递给接受HttpsOptionsonCall(),例如memory。关于第二代的令人兴奋的事情之一是它提供了比第一代更高的内存分配,所以我在这里已经证明了这一点;1GB";至";16GiB";(还要注意从"GB"到"GiB"的变化)。

注5:";函数名称仅限于小写字母、数字和短划线"但希望很快就会到来;支持在函数名称中使用大写字母">

共享

无需更改

现在有一个升级指南,描述了如何迁移到第二代。您将在指南中看到全部细节,但大致轮廓是:

  1. 更新代码中的导入和触发器定义
  2. 如果您使用的是functions.config,请转到参数化配置
  3. 将流量迁移到新的第二代功能

还要注意,函数可以一个接一个地迁移,所以不必一次完成所有操作:

第一代和第二代函数可以在同一文件中并排共存。这使得您可以在准备好的时候轻松地逐个迁移。我们建议一次迁移一个函数,在继续之前执行测试和验证。

-迁移过程

相关内容

  • 没有找到相关文章

最新更新