"use server";

import { cookies } from "next/headers";

export async function createCookie(token: string | null) {
  const options = {
    httpOnly: process.env.NEXT_PUBLIC_NODE_ENV !== "development",
    secure: process.env.NEXT_PUBLIC_NODE_ENV !== "development",
    path: "/",
  };
  if (!token) {
    throw new Error("Token is required");
  }
  const cookieStore = await cookies();

  cookieStore.set("token", token, options);
}

export async function deleteCookie(name: string) {
  (await cookies()).delete(name);
}

이런 server action 함수가 있을 때

 

export async function login(
  _: LoginState,
  formData: FormData
): Promise<LoginState> {
  try {
    const inputData = {
      email: formData.get("email") as string,
      password: formData.get("password") as string,
    };

    const response = await fetch(`${API_URL}/users/login`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ user: inputData }),
    });

    const responseData = await response.json();

    if (!response.ok) {
      return {
        success: false,
        error: createDisplayError(responseData.error, response.status),
        value: { inputData },
      };
    }

    const cookieStore = await cookies();
    cookieStore.set("token", responseData.user.token, {
      httpOnly: process.env.NEXT_PUBLIC_NODE_ENV !== "development",
      secure: process.env.NEXT_PUBLIC_NODE_ENV !== "development",
      path: "/",
    });

    return {
      success: true,
      value: { inputData, token: responseData.user.token },
    };
  } catch (error) {
    return {
      success: false,
      error: { name: "UnexpectedError", message: (error as Error).message },
      value: { inputData: { email: "", password: "" } },
    };
  }
}

이렇게 직접 사용하는건 되고

 

export async function login(
  _: LoginState,
  formData: FormData
): Promise<LoginState> {
  try {
    const inputData = {
      email: formData.get("email") as string,
      password: formData.get("password") as string,
    };

    const response = await fetch(`${API_URL}/users/login`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ user: inputData }),
    });

    const responseData = await response.json();

    if (!response.ok) {
      return {
        success: false,
        error: createDisplayError(responseData.error, response.status),
        value: { inputData },
      };
    }

    createCookie(responseData.token);

    return {
      success: true,
      value: { inputData, token: responseData.user.token },
    };
  } catch (error) {
    return {
      success: false,
      error: { name: "UnexpectedError", message: (error as Error).message },
      value: { inputData: { email: "", password: "" } },
    };
  }
}

은 

unhandledRejection:  Error: Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options
    at createCookie (actions/cookie.ts:16:14)
  14 |   const cookieStore = await cookies();
  15 |
> 16 |   cookieStore.set("token", token, options);
     |              ^
  17 | }
  18 |
  19 | export async function deleteCookie(name: string) {

 

이런 에러가 나오면서 안된다

'개발 > 기록' 카테고리의 다른 글

제네릭 타입 선언시 nerver와 void의 차이  (0) 2025.03.01
유용한 css  (0) 2025.02.24
null undefined 차이  (0) 2025.02.19
면접 질문 정리  (2) 2025.02.07
NIST 패스워드 가이드라인 2024 업데이트  (0) 2025.01.09

+ Recent posts