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

Next.js调用Lucia登出Server Action报错:dns未定义

解决Next.js中Lucia登出Server Action的"dns is not defined"问题

核心问题

你碰到的错误本质是Server Action被误在客户端执行了——Lucia依赖服务端环境的底层模块(比如dns),客户端组件直接调用或错误引入服务端代码就会触发这个报错。

具体解决步骤

  • 正确标记Server Action
    给登出Action函数加上'use server'指令,并且把这个函数放在服务端组件文件或者单独的actions/目录下(Next.js会自动识别该目录下的文件为服务端专属代码)。示例代码:

    // app/actions/auth.ts
    'use server';
    
    import { lucia } from '@/lib/lucia';
    import { cookies } from 'next/headers';
    
    export async function logout() {
      const sessionId = cookies().get(lucia.sessionCookieName)?.value;
      if (!sessionId) return;
    
      // 数据库检查逻辑
      const session = await lucia.validateSession(sessionId);
      if (session) {
        await lucia.invalidateSession(sessionId);
      }
    
      // 清除Cookie
      const sessionCookie = lucia.createBlankSessionCookie();
      cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes);
    }
    
  • 客户端组件正确调用
    在客户端组件里直接导入并调用这个Action就行,不需要用useCallback包裹,Next.js会自动处理客户端到服务端的调用逻辑:

    // app/components/LogoutButton.tsx
    'use client';
    
    import { logout } from '@/app/actions/auth';
    
    export default function LogoutButton() {
      return (
        <button onClick={async () => {
          await logout();
          // 登出后跳转首页,避免状态不一致
          window.location.href = '/';
        }}>
          登出
        </button>
      );
    }
    
  • 排查错误引入

    • 别在客户端组件里直接导入Lucia的服务端核心模块(比如@lucia-auth/lucia的实例),这些只能在服务端代码里用。
    • 不要把Server Action的函数定义写在客户端组件文件里,必须拆分到服务端专属文件中。

额外提醒

如果用的是Next.js App Router,确保actions/目录在app/路径下,或者Action所在文件没有'use client'指令。

内容的提问来源于stack exchange,提问作者Amor.o

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:14:53