deVSner

express - app, use, middle-ware, wildcard, 404 처리 미들웨어, 에러 처리 미들웨어 본문

카테고리 없음

express - app, use, middle-ware, wildcard, 404 처리 미들웨어, 에러 처리 미들웨어

RudeofSun 2020. 8. 29. 20:54

 

 

http가 아닌 const express = require('express')를 불러온다

app.set('port', process.env.PORT || 3001) -> 서버에다가 속성을 심는 것

 

 

1.

app.use가 미들웨어가 아니라, req, res, next부터 next()까지가 미들웨어다. 라우어도 미들웨어다.

 

 

2. 

next()가 있기 때문에 라우트를 연결할 수 있다

app.use( (req, res, next) => {
  console.log(1)
  next()
}, (req, res, next) => {
  console.log(2)
  next()
}, (req, res, next) => {
  console.log(3)
  next()
} )

 

3. 

next에 에러가 들어가면 다음 미들웨어로 가는게 아니라, 바로 에러 처리 미들웨어로 넘어간다

app.use((req,ues,next) => {
  console.log('요청 실행')
  next()
}, (req, res, next) => {
  try {
    console.log('에러')
  } catch(err) {
    next(error)   
  }
}

 

 

4. 

next route라는 키워드를 넣을 수 잇다. 많이 쓰이지는 않다만,

next에 route라는 키워드를 넣을 수 있다.

같은 라우터의 로직이 밑에 남아있더라도, 곧바로 다음 미들웨어로 넘어가게 하는 것.

next 안에 인수가 들어가 있으면 다 에러나는데, 한 가지 예외가 route 다

 

이걸 언제 활용하냐면, if문으로 조건 분기 처리할 때 쓴다.

다음 미들웨어로 가게 할 지, 아니면 같은 라우터의 남은 로직을 계속 수행시킬 지.

app.get('/', (req, res) => {
  res.send('')
  next('route')
}, (req,res,next) => {
  console.log('hello')
})

 

 

 

4.

와일드카드. 

만약 와일드카드 라우터가 일반 라우터보다 위에 있다면, 죄다 와일드카드 라우터에서 다 걸려버린다

express는 위에서 아래로, 왼쪽에서 오른쪽으로, 의 순서가 굉장히 중요하다

 

app.get('/category/3', (req,res) => {
  res.send('ululalala')
})
app.get('/category/:num', (req,res) => {
  res.send('hello ${req.params.num')
 
})

 

 

5.

모든 겟요청을 받는다

app.get('*', (req,res) => {  
  res.send('hello ${req.params.num')             
})

 

 

6.

해당 라우터의 위치가 중요하다. 아래의 라우터의 위치는, 와일드카드 라우터 밑에, 에러 미들웨어 위, 여야 한다

응답은 에러 객체를 나타내는게 아니다. 위에서 아래로 코드를 실행했을 때, 해당 라우트 주소가 없을 때,

이 라우터가 실행이 된다.

한 가지 주의할 점이, 실제로는 404지만, 브라우저에는 200이라고 상태 코드를 전달할 수가 있다.

즉, 브라우저를 속일 수 있다는거다.

해커들이 에러 코드를 알게 되면, 에러코드는 각각 뜻을 내포하고 있기 때문에 악용의 소지가 있다.

200은 괜찮을 지 몰라도, 400과 500번대의 에러는 각별히 조심해야 한다. 

보통은 404로 퉁치는 경우가 많다.

해커들이 뭐가 잘못된건 지 모르게 해야 한다. 

app.use((req,res,next) => {
  res.status(404).send('404 처리, 에러는 아님') 
})

 

 

7.

에러 미들웨어는 인수 4개를 다 써야 한다

app.use((err,req,res,next) => {
  console.error(err);
  res.send('에러')
})

 

 

8.

res.writeHead(200, { 'Content-type' : 'text/plain' } )
res.end('안녕하세요')
위의 코드가 express 로 오면 아래로 바뀐다.
res.send('안녕하세요')
express에서도 http 써도 된다 근데 엥간하면 쓰지마라
나중에
res.setHeader('Content-Type', 'text/plain') 이렇게 쓰면 된다 (필요하다면)

res.writeHead(200, { 'Content-Type' : 'application/json' } )
res.end(JSON.stringify( { hello : 'sj' } ))
위의 코드가 express 로 오면 아래로 바뀐다.
res.json( { hello: 'sj' } )

 

 

9.

res.json( { hello: 's' } ) <-- 리턴이 아니다. 밑에 콘솔로그가 잇어도 실행이 된다 그냥 응답을 보낼 뿐이다. 함수를 종료하는게 아니다
자바스크립트는 리턴을 해야 종료가 되는거다!