使用Better-Auth结合Google OAuth时出现内部服务器错误:Cannot read properties of undefined (reading 'map')
使用Better-Auth结合Google OAuth时出现内部服务器错误:Cannot read properties of undefined (reading 'map')
看起来你遇到的问题出在获取请求头的方式和传递给Better-Auth的参数格式上,我来帮你拆解一下:
问题根源分析
headers()函数的误用:在Next.js Middleware里,全局的headers()函数是同步的,不需要加await;而且你应该从传入的request对象中获取请求头,而不是直接调用全局的headers()——这会导致Better-Auth无法正确解析会话所需的Cookie或Authorization头,进而触发内部的map调用错误(因为某个预期的数组参数变成了undefined)。- 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
相关产品推荐
相关产品推荐

