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

使用Better-Auth结合Google OAuth时出现内部服务器错误:Cannot read properties of undefined (reading 'map')

使用Better-Auth结合Google OAuth时出现内部服务器错误:Cannot read properties of undefined (reading 'map')

看起来你遇到的问题出在获取请求头的方式和传递给Better-Auth的参数格式上,我来帮你拆解一下:

问题根源分析

  1. headers() 函数的误用:在Next.js Middleware里,全局的headers()函数是同步的,不需要加await;而且你应该从传入的request对象中获取请求头,而不是直接调用全局的headers()——这会导致Better-Auth无法正确解析会话所需的Cookie或Authorization头,进而触发内部的map调用错误(因为某个预期的数组参数变成了undefined)。
  2. Middleware参数错误:Next.js的Middleware函数的第二个参数不是NextResponse,而是NextFetchEvent(不过这个在你的场景里暂时用不上),虽然这个不是直接报错原因,但规范写法也需要修正。

修正后的Middleware代码

把你的Middleware函数改成下面这样:

import { NextRequest, NextResponse } from 'next/server';
// 确保你已经正确初始化了auth实例
import { auth } from '@/lib/auth'; // 这里路径根据你的实际项目调整

export async function middleware(request: NextRequest) {
  // 从request对象中获取headers,不需要await
  const session = await auth.api.getSession({
    headers: Object.fromEntries(request.headers.entries())
  });

  if (!session) {
    return NextResponse.redirect(new URL('/sign-in', request.url));
  }

  return NextResponse.next();
}

关键修改点

  • 获取正确的headers:用request.headers.entries()把请求头转换成普通对象再传给getSession,这是Better-Auth期望的格式,避免内部解析时出现undefined的情况。
  • 移除不必要的await:全局headers()不需要await,直接用request的headers更准确。
  • 修正Middleware参数:去掉了多余的response参数,因为Next.js Middleware的第二个参数是事件对象,不是响应对象。

额外排查点

如果改完还是报错,你可以再检查这两个地方:

  • 确保你的Better-Auth初始化配置里,已经正确配置了Google OAuth的客户端ID、密钥,以及和Vercel/本地开发一致的回调地址。
  • 本地开发时,确认你的Cookie配置是跨域兼容的(比如sameSite设置为lax或none,如果是HTTPS环境)。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:53:06