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
相关产品推荐
相关产品推荐

