Next.js13中使用graphql-yoga报错createServer不是函数,求解决方案
问题解答
确认:教程确实已过时
你遇到的错误源于两个核心变更:
- GraphQL Yoga API更新:旧版本
@graphql-yoga/node导出的createServer方法在v3+版本中已被移除,替换为createYoga方法。 - Next.js 13路由机制变化:Next.js13新增了App Router,同时Pages Router的API路由写法也有推荐更新,旧教程基于Next.js12的写法不再适配当前版本。
Next.js13中正确的GraphQL Yoga配置方法
情况1:使用Pages Router(和旧教程路由模式一致)
在pages/api/index.js(或pages/api/graphql.js)中编写如下代码:
import { createYoga, createSchema } from '@graphql-yoga/node'; import { readFileSync } from 'fs'; import { join } from 'path'; // 读取GraphQL schema文件 const typeDefs = readFileSync(join(process.cwd(), 'schema.graphql'), 'utf8'); // 定义解析器 const resolvers = { Query: { cart: (_, { id }) => ({ id, totalItems: 0, }), }, }; // 创建Yoga实例 const yoga = createYoga({ schema: createSchema({ typeDefs, resolvers }), endpoint: '/api', // 对应API路由路径 cors: false, logging: { prettyLog: false, }, }); // 导出HTTP方法处理函数(Next.js Pages Router推荐写法) export { yoga as GET, yoga as POST };
情况2:使用Next.js13 App Router
在app/api/graphql/route.js中编写如下代码:
import { createYoga, createSchema } from '@graphql-yoga/node'; import { readFileSync } from 'fs'; import { join } from 'path'; const typeDefs = readFileSync(join(process.cwd(), 'schema.graphql'), 'utf8'); const resolvers = { Query: { cart: (_, { id }) => ({ id, totalItems: 0, }), }, }; // 创建Yoga实例并获取请求处理器 const { handleRequest } = createYoga({ schema: createSchema({ typeDefs, resolvers }), graphqlEndpoint: '/api/graphql', // 对应App Router的API路径 cors: false, logging: { prettyLog: false, }, // 适配App Router的Fetch API环境 fetchAPI: { Request, Response }, }); // 导出HTTP方法处理函数(App Router强制要求写法) export { handleRequest as GET, handleRequest as POST };
额外注意事项
- 确保安装最新版依赖:运行
npm install @graphql-yoga/node graphql更新包版本。 - 使用App Router时,可在路由文件顶部添加
export const runtime = 'nodejs';指定运行时(默认是edge runtime,部分场景下需要node runtime)。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

