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

Firebase云函数:apollo-server-express迁移至@apollo/server v4或graphql-yoga

GraphQL服务迁移指南(从废弃的apollo-server-express到v4或GraphQL Yoga)

背景说明

apollo-server-express与apollo-server-cloud-functions已被官方废弃,但多数GraphQL+Firebase云函数教程仍在使用它们。以下是针对你的原有代码,分别提供迁移至@apollo/server v4和改用GraphQL Yoga的实现方案。


方案一:迁移至@apollo/server v4

1. 安装依赖

先替换旧依赖,安装v4相关包:

npm uninstall apollo-server-express
npm install @apollo/server @as-integrations/express graphql express firebase-admin

2. 修改服务初始化代码

v4版本移除了内置的dataSources,需要在context中手动实例化数据源;同时集成Express的方式也有变化,具体修改如下:

import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@as-integrations/express';
import admin from 'firebase-admin';
import express from 'express';
import schema from './schema';
import resolvers from './resolvers';
import UsersAPI from './datasources/users';
const serviceAccount = require('../../private/serviceAccount.json');
const databaseURL = 'https://my-app.firebaseio.com';

// 初始化Firebase Admin
const globalServerApp = admin.initializeApp(
  { credential: admin.credential.cert(serviceAccount), databaseURL },
  'server'
);

const initServer = async () => {
  const app = express();

  // 创建Apollo Server实例
  const server = new ApolloServer({
    typeDefs: schema,
    resolvers,
    // v4中默认开启开发环境的Sandbox(替代原playground),生产环境需手动开启introspection
    introspection: true,
  });

  // 必须先启动Apollo Server
  await server.start();

  // 将Apollo Server集成到Express
  app.use(
    '/',
    express.json(),
    expressMiddleware(server, {
      context: async ({ req }) => {
        // 手动注入数据源和请求对象到context
        return {
          request: req,
          dataSources: {
            usersAPI: new UsersAPI(globalServerApp),
          },
        };
      },
    })
  );

  return app;
};

export default initServer;

3. 修改用户Schema代码

仅需替换gql的导入路径,其余定义无需改动:

import { gql } from '@apollo/server';

const UserSchema = gql`
  scalar JSONObject
  type Something {
    customer: String
  }

  extend type Query {
    doSomething(someIDs: [String]): [Something]
  }

  extend type Mutation {
    completeRegistration(
      uid: ID!
      first_name: String
      last_name: String
      invited_by: JSONObject
    ): Boolean
  }
`;

export default UserSchema;

方案二:改用GraphQL Yoga实现

GraphQL Yoga是轻量且兼容标准GraphQL的服务框架,配置更简洁,适合快速替换。

1. 安装依赖

npm uninstall apollo-server-express
npm install graphql-yoga graphql express firebase-admin

2. 修改服务初始化代码

import { createYoga, createSchema } from 'graphql-yoga';
import admin from 'firebase-admin';
import express from 'express';
import typeDefs from './schema';
import resolvers from './resolvers';
import UsersAPI from './datasources/users';
const serviceAccount = require('../../private/serviceAccount.json');
const databaseURL = 'https://my-app.firebaseio.com';

// 初始化Firebase Admin
const globalServerApp = admin.initializeApp(
  { credential: admin.credential.cert(serviceAccount), databaseURL },
  'server'
);

const initServer = () => {
  const app = express();

  // 创建GraphQL Yoga实例
  const yoga = createYoga({
    schema: createSchema({
      typeDefs,
      resolvers,
    }),
    context: async ({ request }) => {
      return {
        request,
        dataSources: {
          usersAPI: new UsersAPI(globalServerApp),
        },
      };
    },
    // 开启introspection,Yoga默认在开发环境启用Sandbox
    graphqlEndpoint: '/',
  });

  // 将Yoga挂载到Express
  app.use(yoga);

  return app;
};

export default initServer;

3. 修改用户Schema代码

仅需替换gql导入路径,支持标准GraphQL定义:

import { gql } from 'graphql-yoga';

const UserSchema = gql`
  scalar JSONObject
  type Something {
    customer: String
  }

  extend type Query {
    doSomething(someIDs: [String]): [Something]
  }

  extend type Mutation {
    completeRegistration(
      uid: ID!
      first_name: String
      last_name: String
      invited_by: JSONObject
    ): Boolean
  }
`;

export default UserSchema;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:49