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

Next.js 13无工具包搭建GraphQL服务器遇405错误求解决

错误原因分析

  • API路由未正确处理请求:api/graphql/route.js中的POST函数未接收req参数,且注释了请求体解构代码,导致query变量未定义,触发服务器内部错误;同时未处理浏览器可能发送的OPTIONS预检请求,直接返回405状态码。
  • 客户端响应解析错误:app/login/page.js中response.json是方法,未加调用括号(),无法正确解析JSON响应。

Next.js 13搭建纯GraphQL服务器的最简方法

1. 定义GraphQL Schema与Resolver

创建api/schema.js:

import { buildSchema } from 'graphql';

export default buildSchema(`
  type Query {
    hello: String
  }
`);

创建api/resolvers.js:

export default {
  hello: () => 'Hello from pure GraphQL!',
};

2. 实现API路由(兼容POST/OPTIONS)

修改api/graphql/route.js:

import schema from "../schema";
import resolvers from "../resolvers";
import { graphql } from "graphql";
import { NextResponse } from "next/server";

// 处理OPTIONS预检请求,避免跨域/方法不允许错误
export async function OPTIONS() {
  return NextResponse.json({}, {
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type',
    },
  });
}

export async function POST(req) {
  try {
    const { query, variables = {} } = await req.json();
    const result = await graphql({
      schema,
      source: query,
      rootValue: resolvers,
      variableValues: variables,
    });
    return NextResponse.json(result);
  } catch (error) {
    return NextResponse.json({ errors: [{ message: error.message }] }, { status: 500 });
  }
}

3. 客户端调用修正

修改app/login/page.js:

'use client';
import { useEffect } from 'react';

export default function GraphQLAPI() {
  useEffect(() => {
    const handleRequest = async () => {
      try {
        const response = await fetch('/api/graphql', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ query: '{ hello }' }),
        });

        if (!response.ok) throw new Error(`请求失败:${response.status}`);
        
        const { data, errors } = await response.json();
        errors ? console.error('GraphQL错误:', errors) : console.log('返回数据:', data);
      } catch (err) {
        console.error('请求异常:', err);
      }
    };

    handleRequest();
  }, []);

  return <div>GraphQL API</div>;
}

4. 依赖验证

确保已安装graphql包(你的依赖列表中已包含,无需额外安装)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:50:26