node.js express 기반 서버 구동 기본 세팅

박상은·2021년 12월 15일
1

🎁 분류 🎁

목록 보기
10/16

1. express.urlencoded()

application/x-www-form-urlencoded타입으로 들어오는 데이터를 req.body로 파싱해주는 역할을 합니다.

  • 옵션 값: extend: boolean => true면 내장 모듈인 querystring사용, false면 설치해야하는 qs사용

  • enctypeapplication/x-www-form-urlencoded인 데이터는 name=john&age=2같은 형식으로 데이터가 전달된다.
    해당 데이터를 파싱해서 객체형태로 req.body에 넣어주는 역할을 한다.

2. express.json()

application/json타입으로 들어오는 데이터를 req.body로 파싱해주는 역할을 합니다.

3. express.static()

정적 파일들을 제공해주는 역할을 한다.

  • 사용 예시: app.use(express.static("/", path.join(__dirname, "public")))
    위처럼 사용하면 현재 서버측의 public폴더에 있는 파일들을 브라우저에서 /로 접근할 때 보여주라는 의미이다.

cookie를 브라우저로 전송할 때 서명하거나 cookie를 받을 때 파싱해서 req.cookies or req.signedCookies에 넣어주는 역할을 한다.

  • 쿠키파서 사용 예시: app.use(cookieParser("서명에 사용할 비밀키"))

  • 쿠키 생성 예시 ( 서버 -> 브라우저 )
    res.cookie(키값, 속성값, 옵션값)
    옵션값은 maxAge, expires, path, domain, secure, httpOnly, signed가 있다.

  • 쿠키 받는 예시
    1. req.cookies.키값 ( 서명안된 쿠키 )
    2. req.signedCookies.키값 ( 서명된 쿠키 )

5. express-session

서버측에서는 특정 방식으로 데이터전체를 저장하고 해당 데이터를 식별할 수 있는 식별자를 쿠키(세션쿠키)에 실어서 보내는 방식을 사용한다.

  • 여기서 특정 방식이란 메모리, 파일, 데이터 베이스(mysql, mongodb, radis)등을 의미한다.

  • 사용 예시: app.use(expressSession({옵션값}))

옵션값에는 httpOnly, secure, secret, resave, saveUninitialized, cookie, store등이 있다.

6. 에러처리 미들웨어

next()에 인자를 넘겨줄 경우에 에러 처리 미들웨어에서 받아서 처리해 준다.
주의할 점은 미들웨어는 순서대로 실행되므로 가장 마지막에 붙여줘야 다른 요청을 가로채지 않는다.

// 404 에러처리 미들웨어
app.use(function(req, res, next) {
  console.log("404 에러처리 미들웨어");
  res.status(404).send('404');
});

// 에러처리 미들웨어
app.use((error, req, res, next) => {
  console.error("에러처리 미들웨어 >>", error);
  res.status(500).json({ error: "Error" });
});

7. 전체 적용 코드 예시

import dotenv from "dotenv";
dotenv.config();

import path from "path";
import express from "express";
import cookieParser from "cookie-parser";
import expressSession from "express-session";
import fileStore from "session-file-store";

const __dirname = path.resolve();
const FileStore = fileStore(expressSession);
const app = express();
app.set("PORT", process.env.PORT);

// middleware
app.use("/", express.static(path.join(__dirname, "public")));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
  expressSession({
    resave: false,
    saveUninitialized: false,
    name: "session-cookie",
    secret: process.env.COOKIE_SECRET,
    cookie: {
      httpOnly: true,
      secure: false,
    },
    store: new FileStore(),
  }),
);

// routes
import authRouter from "./routes/auth.js";

// router 등록
app.use("/auth", authRouter);

// 404 에러처리 미들웨어
app.use(function(req, res, next) {
  console.log("404 에러처리 미들웨어");
  res.status(404).send('404');
});

// 에러처리 미들웨어
app.use((error, req, res, next) => {
  console.error("에러처리 미들웨어 >>", error);
  res.status(500).json({ error: "Error" });
});

app.listen(app.get("PORT"), console.log(`${app.get("PORT")}번 대기중`));

0개의 댓글