express에 대해 배운 것

김민석·2021년 3월 23일
0

Immersive

목록 보기
27/30

어제 fs 모듈을 활용하여 채팅이 가능한 서버를 만들었었다.
오늘은 그것을 express 모듈을 사용하여 리팩토링 해보았다.

이 글은 리팩토링을 하면서 express에 대해 배운 것에 대한 짤막한 정리다.
참고: express 공식 사이트


1. express()

공식 문서

const express = require('express')
const app = express()

Express application을 생성한다.

app 객체는

  1. Routing을 위한 메소드: app.METHOD and app.param
  2. middleware 설정을 위한 메소드: app.route
  3. Rendering HTML views : app.render
  4. Registering a template engine : app.engine

들을 갖고 있다. (아래 두 개는 현재로서는 무슨 말인지 알아 듣지 못하였다.)

이 app의 method들을 이용해서 이런 식으로 구현할 수 있었다.


app.get('/messages',(req,res)=>{
    fs.readFile('data/data.json',(err,data)=>{
        res.status(200).json(JSON.parse(data))  
    })
})

app.post('/messages',jsonParser,(req,res)=>{
    let previous = JSON.parse(fs.readFileSync('data/data.json'))
    previous['results'].push(req.body)
    fs.writeFileSync('data/data.json',JSON.stringify(previous))
    res.status(201).json('finished')
    
})

app 객체는 get, post 같은 메소드를 갖고 있고, 이런 식으로 분기 설정이 가능하다.

첫 번째 app은 get 요청이 /messages 경로 값을 갖고 들어왔을 때,

두 번째는 post 요청이 /messages 경로 값을 갖고 들어왔을 때를 의미한다.


위의 코드를 app.route 메소드를 이용하여 조금 줄여보았다.

app.route('/messages')
    .get((req,res)=>{
        fs.readFile('data/data.json',(err,data)=>{
            res.status(200).json(JSON.parse(data))  
        })
    })
    .post(jsonParser,(req,res)=>{
        let previous = JSON.parse(fs.readFileSync('data/data.json'))
        previous['results'].push(req.body)
        fs.writeFileSync('data/data.json',JSON.stringify(previous))
        res.status(201).json('finished')
        
    })

우선 app.route로 /messages path 값을 갖고 들어온 요청을 한번 걸러준 후,
그 다음 get/post method에 따라 분기 처리를 해줄 수 있었다.


req/res

기본적으로 express에서 middleware에서의 req/res는 http 모듈의 req/res을 상속 받은 것으로 보인다.
따라서 모든 메소드를 사용할 수 있으며, 더 나아가 편리한 다른 메소드들이 있었다.

req 공식 문서res 공식 문서

이를 이용하여 res.writeHeadres.end()를 사용하여 응답을 해줬던 것을 아래와 같이 줄일 수 있었다.

res.status(200).send(data)

send는 데이터 타입에 따라 다른 방향으로 작동하는 것으로 보인다.

코드를 작성하다가

내가 서버에서 buffer 형태로 데이터를 보내도
fetchbody.json()buffer를 JSON 형태로 보내주는 것을 발견하였다.

404 error handling

http 모듈을 사용하여 조건문을 통해 분기를 나눌 때에는
분기에 걸리지 않는 것은 404에러를 처리하는 것으로 해결하였었다.

그러나 express에서 404 응답은 오류처리가 안된다고 한다.

따라서, express를 사용할 때, 404 error는 모든 미들웨어 함수와 라우트를 실행했음에도 아무것도 응답하지 않았다는 뜻으로 이해하면 된다.

그러므로 404에러는 모든 함수들의 가장 아랫단에 404에러를 뱉는 코드를 추가하여, 다른 모든 것들을 통과한 요청들에 응답하는 식으로 처리한다.

app.use(function(req, res, next) {
  res.status(404).render('not found')
});

0개의 댓글