You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fastify服务无法部署至Google Cloud Functions问题排查

Fastify服务部署到Google Cloud Functions时端点无法部署的问题

我有一个包含约10个API端点的Fastify服务,按照Fastify官方文档的说明,将fastifyFunction实例导入到Google Cloud Functions的index.ts文件并导出(代码如下)。但部署时,其他函数(如user_post、user_get等)均可正常部署,唯有fastifyServer对应的端点无法部署,甚至看不到Firebase尝试编译或构建该端点的步骤。请问我是否遗漏了文档中的某些内容?

现有代码

fastifyServer/src/index.ts

import Fastify, {FastifyReply, FastifyRequest} from "fastify";
import defaultController from "./default/defaultController";
import router from "./routers";

const f = Fastify({
  logger: true,
  ajv: {
    customOptions: {
      removeAdditional: false,
    },
  },
});

f.addContentTypeParser('application/json', {}, (_req, body, done) => {
  done(null, body);
});

/** ******Routes********/

f.register(defaultController, {prefix: "/"});
f.register(router, {prefix: "/api/v1"});

/********Run Server********/
// f.listen({port: 3000}, function(err, _address) {
//   if (err) {
//     console.error(err);
//     process.exit(1);
//   }
//   console.log("server listening on " + _address);
// });

const fastifyServer = async (request: FastifyRequest, reply: FastifyReply) => {
  await f.ready();
  f.server.emit("request", request, reply);
};

export default fastifyServer;

function/src/index.ts

import {initializeApp} from "firebase-admin/app";

import {users_get_all} from "./users";
import {user_get, user_post} from "./user";

import {makeUppercase, sendWelcomeEmail} from "./triggered";

import fastifyServer from "./fastifyServer/src/index";

//firebase init.
export const app = initializeApp();

// export grouped functions
exports.metrics = require("./metrics");

// export individual functions
export {
  user_post,
  user_get,
  users_get_all,
  makeUppercase,
  sendWelcomeEmail,
  // export api fastify server
  fastifyServer,
};

问题原因及解决方案

1. HTTP函数签名不兼容

Google Cloud Functions的HTTP触发器只识别符合Node.js HTTP模块或Express风格的请求/响应对象签名((req: IncomingMessage, res: ServerResponse)或(req: Request, res: Response)),你当前使用的FastifyRequest和FastifyReply是Fastify内部类型,与Cloud Functions的类型不匹配,导致部署工具无法识别这是一个HTTP函数。

修改fastifyServer的函数签名,适配Cloud Functions要求:

// fastifyServer/src/index.ts
import Fastify, { FastifyInstance } from "fastify";
import defaultController from "./default/defaultController";
import router from "./routers";
// 导入Node.js HTTP模块的类型
import type { IncomingMessage, ServerResponse } from "http";

const f: FastifyInstance = Fastify({
  logger: true,
  ajv: {
    customOptions: {
      removeAdditional: false,
    },
  },
});

// 保留原有的Fastify配置和路由注册
f.addContentTypeParser('application/json', {}, (_req, body, done) => {
  done(null, body);
});

f.register(defaultController, {prefix: "/"});
f.register(router, {prefix: "/api/v1"});

// 适配Cloud Functions的签名
const fastifyServer = async (req: IncomingMessage, res: ServerResponse) => {
  await f.ready();
  // 将Cloud Functions的请求/响应对象传递给Fastify
  f.server.emit("request", req, res);
};

export default fastifyServer;

2. 验证部署命令与配置

  • 单独部署fastifyServer函数:执行firebase deploy --only functions:fastifyServer,确认工具是否开始处理该函数。
  • 检查firebase.json是否存在rewrite规则,避免覆盖fastifyServer的端点路径。

3. 依赖配置检查

确保fastify及相关依赖在package.json的dependencies字段中(不要放在devDependencies),避免部署时遗漏依赖导致函数无法初始化。

内容的提问来源于stack exchange,提问作者Dawit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:32:03