express를 사용해 node.js로 서버 만들기

citron03·2022년 1월 29일
0

html, css, js

목록 보기
20/43
  • Node.js 환경에서 Express.js는 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크입니다.
  • http 모듈로 만드는 대신에 express를 사용하여 서버를 만들면, 미들웨어의 추가가 편하고, 자체 라우터를 제공한다.
  • 이를 통해서 express로 더 쉽게 웹 서버를 만들 수 있다.
    🥭 npm init으로 시작할 수 있다.
    🥭 npm i express로 설치할 수 있다.

🍏 npm install express

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

express의 공식문서
https://expressjs.com/ko/starter/hello-world.html
를 참고하여 간단한 서버를 만들 수 있다.

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}`)
})
  • 서버를 실행하는 방법은 node 만든 서버 파일.js 를 통해 실행한다.

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

  • express는 프레임워크 자체에서 편리하게 사용할 수 있는 라우터 기능을 제공한다.
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()); 를 작성한다.
profile
🙌🙌🙌🙌

0개의 댓글