Next.js 13.4路由处理器Cookies()函数开发可用生产失效
我使用Next.js 13.4前端,搭配基于Doorkeeper、通过HTTP-Only Cookie认证的Rails 7纯API后端。开发环境下(前端localhost:3000,后端localhost:3001),Next.js的cookies()函数或Request对象的req.cookies()能正常获取浏览器中的access_token Cookie,并传递给Rails API请求。但在生产环境中,Next.js部署在Netlify,后端部署在Heroku(跨域),这两个方法都返回空对象——尽管通过浏览器开发者工具能看到access_token已正确存储。生产环境下Cookie设置为Secure、sameSite=None、HttpOnly,且双方都通过HTTPS通信,理论上支持跨域共享。
代码流程说明
提交更新表单时,客户端组件会向PUT路由处理器发起fetch请求,已添加credentials: 'include'配置:
客户端组件代码(form.component.tsx)
// handlers const submitHandler: SubmitHandler<ProductFormData> = async ( formData: ProductFormData ) => { setLoading(true); // 格式化表单数据用于请求 const encodedData = encodeProductFormData(formData, defaultImage, images); try { // 更新逻辑 if (product) { const response = await fetch(`/api/products/${ product.slug }`, { credentials: 'include', method: 'PUT', body: encodedData }); } else { // 创建逻辑 const response = await fetch('/api/products', { credentials: 'include', method: 'POST', body: encodedData }); } router.push('/'); } catch (error) { setLoading(false); console.error('请求出错:', error); } };
路由处理器代码(/api/products/[slug]/route.ts)
export const PUT = async ( request: NextRequest, { params }: { params: { slug: string } } ) => { // 从Cookie中提取Doorkeeper认证令牌 const token = request.cookies.get('access_token'); // 获取路由参数中的slug const slug = params.slug; // 获取请求中的表单数据 const formData = await request.formData(); // 调用后端更新接口 const product = await updateProduct(slug, formData, token); // 构造响应 const response = NextResponse.json( { product: product }, { status: 200 } ); // 刷新数据与路由缓存 revalidatePath('/'); return response; };
如果直接从表单调用Rails后端,Cookie可以正常发送,但无法调用revalidatePath刷新缓存,导致前端内容无法更新。
请问:是什么原因导致Cookie无法传递到路由处理器?
内容的提问来源于stack exchange,提问作者baconsocrispy
相关产品推荐
相关产品推荐

