Space
article thumbnail
Published 2024. 4. 16. 10:09
[NextJS] Route Handlers React & NextJS
반응형

[NextJS] Route Handlers

설정

// app/api/route.ts
import { NextRequest } from "next/server";

export async function GET(request: NextRequest) {

}

 

app 디렉터리 내의 route.ts (js) 파일로 정의됩니다.

app 디렉터리 내에서 route.ts로 파일이름을 설정하면 NextJS가 알아서 API Router로 인식합니다.

 

라우터 핸들러는 app 디렉터리 내에서만 사용할 수 있습니다.


HTTP 메서드

POST, GET, PUT, PATCH, DELETE, OPTIONS,... 등이 지원됩니다.

지원되지 않는 메서드를 호출하면 405번 에러가 발생합니다. (Method Not Allowed)

 

반응형

예시

// app/api/route.ts

import { NextRequest } from "next/server";

export async function POST(request: NextRequest) {
  const data = await request.json();
  return Response.json(data);
}

 

"use client"

export default function LogIn() {
  const onClick = async() => {
    const response = await fetch("/api", {
      method: "POST",
      body: JSON.stringify({
        username: "gg",
        password: "1111",
      }),
    });
    console.log(await response.json());
  }

  return (
    <button onClick={onClick}>Log in</button>
  )
}

 

로그인 버튼 클릭 시 

/api의 POST에 의해 return 된 값이 나타난다.

{username: 'gg', password: '1111'}

NextRequest & Request

Request도 많이 사용하지만,

NextRequest가 Request보다 더 좋은 점은

쿠키, ip, 위치, 현재 사용자의 url, 이동할 url 정보도 제공해 주기 때문이다.

// NextRequest

export declare class NextRequest extends Request {
    [INTERNALS]: {
        cookies: RequestCookies;
        geo: RequestData['geo'];
        ip?: string;
        url: string;
        nextUrl: NextURL;
    };
    constructor(input: URL | RequestInfo, init?: RequestInit);
    get cookies(): RequestCookies;
    get geo(): {
        city?: string | undefined;
        country?: string | undefined;
        region?: string | undefined;
        latitude?: string | undefined;
        longitude?: string | undefined;
    } | undefined;
    get ip(): string | undefined;
    get nextUrl(): NextURL;
    /**
     * @deprecated
     * `page` has been deprecated in favour of `URLPattern`.
     * Read more: https://nextjs.org/docs/messages/middleware-request-page
     */
    get page(): void;
    /**
     * @deprecated
     * `ua` has been removed in favour of \`userAgent\` function.
     * Read more: https://nextjs.org/docs/messages/middleware-parse-user-agent
     */
    get ua(): void;
    get url(): string;
}

 

반응형
profile

Space

@Space_zero

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!