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

Next.js应用中Unexpected token错误排查求助

排查Next.js应用注册报错的线索建议

核心错误解析

浏览器控制台抛出的错误本质是:Apollo Client请求GraphQL接口时,收到的不是预期的JSON响应,而是HTML内容(比如<doctype>开头的页面),导致JSON解析失败。

Error: Unexpected token '<', "<!doctype "... is not valid JSON
    at new ApolloError (index.js?6610:29:1)
    at Object.error (QueryManager.js?7fcd:137:74)
    at notifySubscription (module.js?580a:137:1)
    at onNotify (module.js?580a:176:1)
    at SubscriptionObserver.error (module.js?580a:229:1)
    at Object.eval [as error] (asyncMap.js?b322:32:41)
    at notifySubscription (module.js?580a:137:1)
    at onNotify (module.js?580a:176:1)
    at SubscriptionObserver.error (module.js?580a:229:1)
    at eval (iteration.js?8d45:4:50)
    at Array.forEach (<anonymous>)
    at iterateObserversSafely (iteration.js?8d45:4:1)
    at Object.error (Concast.js?a4f8:36:43)
    at notifySubscription (module.js?580a:137:1)
    at onNotify (module.js?580a:176:1)
    at SubscriptionObserver.error (module.js?580a:229:1)
    at RetryableOperation.eval (retryLink.js?c650:55:1)
    at step (tslib.es6.js?f7a0:102:1)
    at Object.eval [as next] (tslib.es6.js?f7a0:83:46)
    at fulfilled (tslib.es6.js?f7a0:73:43)

具体排查方向

  • 验证Apollo Client的GraphQL端点配置
    打开lib/apollo/client.ts,确认客户端配置的uri是否指向正确的API路由(比如/api/graphql)。如果端点写错,Next.js会返回404 HTML页面,直接导致JSON解析错误。

  • 检查GraphQL API路由的可用性
    在浏览器直接访问你的GraphQL端点(例如http://localhost:3000/api/graphql),如果返回的是HTML而不是GraphQL playground或JSON响应,说明API路由文件(如pages/api/graphql.ts)存在问题:

    • 确认文件是否存在
    • 检查文件内是否有语法错误、未捕获的异常,导致返回错误页面
  • 排查注册Mutation的后端逻辑
    查看处理注册的GraphQL resolver代码:

    • 确认是否正确连接PostgreSQL数据库
    • 检查resolver是否抛出未处理的错误,导致后端返回HTML错误页而非JSON响应
    • 验证注册逻辑是否正确生成用户数据并写入数据库
  • 修正fetch请求的错误写法
    之前添加try-catch时出现类型错误,是因为错误地将try-catch放在了fetch的body参数中。正确写法如下,同时注意必须添加Content-Type头,否则后端无法解析JSON:

    const onSubmit = (data: RegisterInput) => {
      return form.handler(() => register({ variables: { data } }), {
        onSuccess: async (data) => {
          try {
            await fetch("/api/login", {
              method: "post",
              headers: { "Content-Type": "application/json" }, // 必须添加该头
              body: JSON.stringify({
                [LOGIN_TOKEN_KEY]: data.register.token,
                [LOGIN_REFRESH_TOKEN_KEY]: data.register.refreshToken,
              }),
            })
            client.writeQuery<MeQuery>({ query: MeDocument, data: { me: data.register.user } })
            router.replace(redirect || "/")
          } catch (error) {
            console.error("登录请求失败:", error)
          }
        },
      })
    }
    
  • 查看网络请求的实际响应
    在Chrome开发者工具的「网络」面板中,找到Apollo发送的GraphQL POST请求:

    • 切换到「响应」标签,确认返回内容是否为HTML
    • 如果是HTML,查看具体内容(如404、500页面),直接定位后端问题
  • 验证数据库连接与权限

    • 确认PostgreSQL服务正在运行
    • 检查应用使用的数据库账号是否有创建用户表、插入数据的权限
    • 查看PostgreSQL日志,确认是否有数据库层面的错误(如表不存在、约束冲突)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:50:21