๐Ÿธminzzi
Minzzi์•ผ
๐Ÿธminzzi
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (133)
    • ์˜ค๋ฅ˜ํ•ด๊ฒฐ (14)
    • FE (36)
      • Next.js (17)
      • React (4)
      • React Native (0)
      • TypeScript (1)
      • JavaScript (14)
    • BE (0)
      • Nest.js (0)
    • ๋ฐ๋ธŒ์ฝ”์Šค (7)
    • ์›น ํ”„๋กœ์ ํŠธ (5)
    • CS (28)
      • Algorithm (5)
      • Python (4)
      • C++ (2)
      • Operating System (4)
      • Computer Networking (3)
      • Data Structure (1)
      • Machine Learning (3)
      • Tip (6)
    • Github (4)
    • Flutter (3)
      • ํ”„๋กœ์ ํŠธ (3)
    • Private (3)
      • ํšŒ๊ณ  (7)
      • ๋ฉด์ ‘ (17)
    • ๊ฐœ๋ฐœ๋„์„œ (8)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • ํ˜ธ์ด์ŠคํŒ…
  • SSR
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • reflow
  • ์ด๋ฒคํŠธ๋ฃจํ”„
  • ์›์‹œํƒ€์ž…
  • ๋ ‰์‹œ์ปฌ
  • ์ฝœ์Šคํƒ
  • ์‹คํ–‰์ปจํƒ์ŠคํŠธ
  • ๋ชจ๋˜๋ฆฌ์•กํŠธ๋”ฅ๋‹ค์ด๋ธŒ
  • next.js
  • ํž™์˜์—ญ
  • layout shift
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • ๋ฉด์ ‘
  • ์˜ค๋ธ”์™„
  • react
  • ์‹คํ–‰์ปจํ…์ŠคํŠธ
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๐Ÿธminzzi

Minzzi์•ผ

Express.js CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
์˜ค๋ฅ˜ํ•ด๊ฒฐ

Express.js CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

2024. 7. 28. 01:48

๐Ÿ‘‡๐Ÿป ํ•ด๊ฒฐ๋ฒ•์€ ๋งจ์•„๋ž˜์—

ํ’€์Šคํƒ๊ตฌํ˜„์ค‘, ํ”„๋ก ํŠธ์—์„œ๋Š” axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ์™€ API ์—ฐ๋™์„ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•˜์˜€๋‹ค. ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด http ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , exportํ•˜์—ฌ axios๋ฅผ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค. 

// http.ts
import axios, { AxiosRequestConfig } from "axios";

const BASE_URL = "http://localhost:3000";
const DEFAULT_TIMEOUT = 30000;

export const createClient = (config?: AxiosRequestConfig) => {
  const axiosInstance = axios.create({
    baseURL: BASE_URL,
    timeout: DEFAULT_TIMEOUT,
    headers: {
      "content-type": "application/json",
    },
    withCredentials: true,
    ...config,
  });

  axiosInstance.interceptors.response.use(
    (response) => {
      return response;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  return axiosInstance;
};

export const httpClient = createClient();

์•„๋ž˜์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๋Š” method๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

import { Category } from "../models/category.modal";
import { httpClient } from "./http";

export const fetchCategory = async () => {
  const response = await httpClient.get<Category[]>("/category");
  return response.data;
};

ํ•˜์ง€๋งŒ fetchํ•ด์„œ ๊ฐ€์ง€๊ณ  ์˜ฌ๋•Œ CORS ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1๏ธโƒฃ Express.js ๊ธฐ์ค€, app.js์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

const cors = require("cors");

const corsOptions = {
  origin: "http://localhost:3001", // ํด๋ผ์ด์–ธํŠธ ํฌํŠธ๋ฒˆํ˜ธ
  credentials: true,
};

app.use(cors(corsOptions));

 

2๏ธโƒฃ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ฃผ์†Œ๋ฅผ ์ž˜ ๊ตฌ๋ถ„ํ•ด์ฃผ์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์—์„œ๋Š” ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

// http.ts(FE)
const BASE_URL = "http://localhost:3000"; // ์„œ๋ฒ„์˜ ํฌํŠธ๋ฒˆํ˜ธ
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'์˜ค๋ฅ˜ํ•ด๊ฒฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] vite+react-ts+tailwind ์ž‘๋™์•ˆ๋จ ํ•ด๊ฒฐ  (2) 2024.08.16
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Git ํŒŒ์ผ๋ช… ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ์ธ์‹ ๋ถˆ๊ฐ€ ๋ฌธ์ œ  (3) 2024.08.14
zsh: command not found: nvm ํ•ด๊ฒฐ  (0) 2024.07.19
api.channel.io API ๊ฐ€์ ธ์˜ค๊ธฐ ์—๋Ÿฌ ํ•ด๊ฒฐ - plugin key  (0) 2024.06.14
TypeError: Cannot destructure property '๋ณ€์ˆ˜๋ช…' of 'req.body' as it is undefined.  (0) 2024.06.02
    '์˜ค๋ฅ˜ํ•ด๊ฒฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] vite+react-ts+tailwind ์ž‘๋™์•ˆ๋จ ํ•ด๊ฒฐ
    • [ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Git ํŒŒ์ผ๋ช… ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ์ธ์‹ ๋ถˆ๊ฐ€ ๋ฌธ์ œ
    • zsh: command not found: nvm ํ•ด๊ฒฐ
    • api.channel.io API ๊ฐ€์ ธ์˜ค๊ธฐ ์—๋Ÿฌ ํ•ด๊ฒฐ - plugin key
    ๐Ÿธminzzi
    ๐Ÿธminzzi

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”