ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js 서버 생성하기 (with express)
    Node 2023. 1. 21. 14:44

    Node.js 환경에서 Express.js는 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크이다.

    http 모듈로 만드는 대신에 express를 사용하여 서버를 만들면, 미들웨어의 추가가 편하고, 자체 라우터를 제공한다.

    이를 통해서 express로 더 쉽게 웹 서버를 만들 수 있다.
    🥭 npm init으로 시작할 수 있다.
    🥭 npm i express로 설치할 수 있다.
    express 역시 내부적으로는 노드의 http 모듈을 사용하고 있다.
    Nest.js도 내부적으로는 express를 사용한다고 하니, express는 node 백엔드 개발자라면 알아두어야 할 라이브러리이다.

    🍏 npm install express 를 통해서 express를 설치해 사용할 수 있다.

    express의 공식문서
    https://expressjs.com/ko/starter/hello-world.html
    를 참고하여 간단한 서버를 만들 수 있다.
    서버를 실행하는 방법은 node 파일.js 를 통해 실행한다.

     

    Express "Hello World" 예제

    Hello world 예제 기본적으로 이 앱은 여러분이 작성할 수 있는 가장 간단한 Express 앱일 것입니다. 이 앱은 하나의 파일로 된 앱이며 Express 생성기를 통해 얻게 되는 앱과는 같지 않습니다. (이 예제

    expressjs.com

    const express = require('express');
    const app = express();
    // 위의 코드로 express를 불러오고 express로 서버를 만든다.
    const port = 3000
    app.get('/', (req, res) => {
      res.send('Hello World!')
    })
    /*
    서버를 키고 설정된 3000번 포트의 '/' endpoint에 
    웹 브라우저로 접속할 시 Hello Wolrd 를 response한다.
    */
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}`)
    })

    메소드와 URL을 통해서 라우터 구현

    • express는 프레임워크 자체에서 편리하게 사용할 수 있는 라우터 기능을 제공한다.
    • 기존에 if else문을 사용하는 것 보다 더 간편하게 사용할 수 있다.
    const router = express.Router();
    // 라우터 기능을 사용한다.
    router.get('/lower', (req, res) =>{
      res.send(data);
    })
    // get이외에도 post, delete, put등을 사용할 수 있다.

    Middleware

    미들웨어를 통해서 간편하게 request에 필요한 기능을 추가하거나, 에러를 탐지할 수 있다.

    미들웨어의 구성

    const app = express();
    app.get('/', function(req, res, next){
      next();
    });
    • 메소드를 사용하고, 인자로 경로와 미들웨어 함수를 받는다.
    • 미들웨어 함수의 인자로는 순서대로 미들웨어 함수에 대한 요청(req), 응답(res), 콜백 인수(next)이다.
    • next를 통해서 다음 미들웨어 함수를 실행한다.
    • 특정 endpoint 경로가 아니라 모든 요청에 동일한 미들웨어 함수를 적용하고자 한다면, 매소드 app.use()를 사용한다.

    자주 사용되는 Middleware들

    모든 요청의 url과 매소드를 확인하기

    const myLogger = function (req, res, next) {
      console.log("http request method : " + req.method 
      + ", url :" + req.originalUrl);
      next();
    };
    app.use(myLogger);
    /*
    이렇게 로그 기능을 추가하여, 
    모든 요청에 대해서 매소드와 url을 확인할 수 있다.
    */

    POST 요청 등에 포함된 body(payload)를 구조화하기

    const bodyParser = require('body-parser');
    const jsonParser = bodyParser.json();
    
    app.use(express.json({strict: false}));
    
    app.post('/upper', jsonParser, function (req, res) {
      // req.body에는 JSON의 형태로 payload가 담겨져 있습니다.
      res.send(req.body.toUpperCase());
      // 요청에서 받은 body의 내용을 대문자로 하여 응답한다.
    })
    • body-parser 미들웨어를 통해서 네트워크상의 chunk를 합치고, buffer를 body로 변환하는 작업을 간편할 수 있다.
    • 위와 같이 body-parser 미들웨어를 사용하여 쉽게 요청에 포함된 body를 받을 수 있다.
    • body-parser 미들웨어를 사용하기 위해서 npm install body-parser로 설치한다.
    • app.use(express.json({strict: false})); 를 통해서 배열과 객체뿐만 아니라 JSON.parse()할 수 있는 모든 변수를 받아들인다.
    • 만약 app.use(express.json({strict: false}));가 없고, request 헤더에 'Content-Type': 'application/json'이 설정되어 있다면, POST로 text가 왔을 때, 빈 객체만 반환된다.
    • res.send를 통해서 응답에 데이터를 담아 보낼 수 있다.
    • res.json에는 res.send가 포함되어 있다.
    • res.json은 'Content-Type', 'application/json'을 설정하고, 받은 인자를 JSON으로 변환하여 보낸다.
    • JSON 데이터를 보낼 때에는 res.json을 사용한다.
    • text로 요청을 할 때는 단순 요청(Simple requests)으로 OPTIONS 매소드 요청이 발생하지 않는다.
    • JSON으로 요청하면, preflighted request가 발생한다.

    모든 요청과 응답에 CORS 헤더를 붙이기

    • cors 미들웨어를 사용하여 쉽게 이를 할 수 있다.
    • npm install cors를 통해 설치한다.
    const cors = require('cors');
    
    app.use(cors());
    // 모든 요청에 대해 CORS를 허용한다.
    • 각 경로와 매소드에 따라서 CORS를 허용할 수도 있다.
    const cors = require('cors');
    
    // 특정 요청에 대해 CORS 허용
    app.get('/lower', cors(), function (req, res, next) {
      res.json({name : "John"})
    });

    요청 헤더에 사용자 인증 정보가 담겨있는지 확인하기

    • 로그인 정보(토큰)이 있는지 확인한다.
    • 토큰이 없으면, 에러 응답을 한다.
    app.use((req, res, next) => {
      // 토큰이 있을 때만 진행한다.
      if(req.headers.token){
        req.isLoggedIn = true;
        next()
      } else {
        res.status(400).send('invalid user')
      }
    })

    🥘 express 버전 4.16 이상에서는 bodyparser가 필요하지 않다. 내부에 해당 기능이 이미 있기 때문이다.

    • 4.16 버전 이상에서 req의 body를 가져오기 위해서는 app.use(express.json()); 를 작성한다.
    const express = require("express");
    const app = express();
    
    app.use(express.json());

    🍪 쿠키 사용 설정

    app.use(
      cors({
        origin: "http://localhost:3000",
        credentials: true, // 서버와 다른 도메인으로부터 쿠키를 받는다.
      })
    );
    • credentials을 받는 옵션을 설정하면, origin은 *이 될 수 없다. (에러발생)
    • ☕️ Access-Control-Allow-Origin 헤더 옵션이 *이 될 수 없다.
    • origin을 true로 설정하거나, 요청을 보낼 클라이언트의 주소로 한다.

     

Designed by Tistory.