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

Next.js中请求/logout路径时删除Cookie失败的问题求助

Next.js中请求/logout路径时删除Cookie失败的问题求助

问题描述

我想要在浏览器请求/logout路径时删除名为auth-token的Cookie,于是写了这样一个page.tsx文件:

"use server";

import { cookies } from "next/headers";
import {redirect} from "next/navigation";

export default async function Page() {
    cookies().delete('auth-token');

    redirect('/');
}

但访问这个/logout页面时,却收到了报错:

Error: Cookies can only be modified in a Server Action or Route Handler.

请问该怎么解决这个问题?


解决方案

这个报错其实说得很清楚啦——Next.js的服务器组件(Server Component)里不能直接修改Cookie,必须用Server Action或者路由处理器(Route Handler)来做这件事,给你两种可行的方案:

方案一:改用Route Handler

你可以在app/logout目录下创建一个route.ts文件(替换原来的page.tsx),用路由处理器来处理删除Cookie和跳转的逻辑:

import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';

export async function GET() {
  cookies().delete('auth-token');
  redirect('/');
}

这样当你访问/logout时,这个GET请求会触发路由处理器里的逻辑,顺利删除Cookie并跳转到首页,完全符合Next.js的规则。

方案二:在Server Component里使用Server Action

如果你还是想保留page.tsx,可以把删除Cookie的逻辑封装成一个Server Action,然后在页面组件里调用它:

// app/logout/page.tsx
import { redirect } from 'next/navigation';

async function logout() {
  'use server';
  const cookies = await import('next/headers').then(m => m.cookies());
  cookies.delete('auth-token');
  redirect('/');
}

export default function LogoutPage() {
  // 页面加载时自动执行Server Action
  logout();
  return <p>正在退出登录...</p>;
}

不过这种方式需要注意,页面组件本身是服务器组件,调用Server Action时要确保逻辑正确,而且页面渲染的内容会在跳转前短暂显示,体验上可能不如路由处理器直接。

总的来说,方案一更直接也更符合Next.js对于修改Cookie的设计规范,推荐你用第一种方法哦!

备注:内容来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:43:12