name: apollo-server description: Apollo Server 配置、插件、缓存、联邦和性能优化。 allowed-tools: Read, Write, Edit, Bash, Glob, Grep
Apollo Server 技能
使用 Apollo Server 实现 GraphQL API 的专家级协助。
能力
- 使用 Express/Fastify 配置 Apollo Server
- 实现日志记录和指标插件
- 设置缓存策略
- 构建 Apollo Federation 网关
- 处理身份验证上下文
- 通过持久化查询优化性能
使用场景
在以下情况下调用此技能:
- 设置 Apollo Server
- 实现缓存
- 构建联邦服务
- 添加自定义插件
- 配置订阅
模式
基础设置
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer';
import express from 'express';
import http from 'http';
import cors from 'cors';
import { typeDefs } from './schema';
import { resolvers } from './resolvers';
import { createContext } from './context';
async function startServer() {
const app = express();
const httpServer = http.createServer(app);
const server = new ApolloServer({
typeDefs,
resolvers,
plugins: [ApolloServerPluginDrainHttpServer({ httpServer })],
});
await server.start();
app.use(
'/graphql',
cors(),
express.json(),
expressMiddleware(server, {
context: createContext,
})
);
await new Promise<void>((resolve) =>
httpServer.listen({ port: 4000 }, resolve)
);
console.log('服务器已就绪:http://localhost:4000/graphql');
}
上下文与身份验证
import { PrismaClient } from '@prisma/client';
import jwt from 'jsonwebtoken';
const prisma = new PrismaClient();
export interface Context {
prisma: PrismaClient;
user: { id: string; role: string } | null;
}
export async function createContext({ req }): Promise<Context> {
const token = req.headers.authorization?.replace('Bearer ', '');
let user = null;
if (token) {
try {
user = jwt.verify(token, process.env.JWT_SECRET!) as Context['user'];
} catch {}
}
return { prisma, user };
}
最佳实践
- 使用插件处理横切关注点
- 实现适当的错误格式化
- 设置响应缓存
- 使用 DataLoader 进行批处理
目标流程
- graphql-api-开发
- apollo-联邦
- api-开发