"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 |