javaScript/nodeJs

nodejs express // #2 미들웨어, app.set, 에러처리

부엉이사장 2022. 7. 1. 22:56
app.use((req, res, next)=>{
    console.log('all request')
    next();
})

이전에 이게 미들웨어라했는데 정확히는 app.use안에 들어가있는 함수가 미들웨어다.

 

app.use('/about', (req, res, next)=>{
    console.log('어바웃')
    next();
})
이렇게 about에서만 실행되게 할수도 있다.

 

 

app.use((req, res, next)=>{
    console.log('all request')
    next(); // next안하면 다음라우터 안넘어감.. 그래서 렉걸린거였네..
}, (req ,res, next)=>{
    console.log('hi2');
    next();
}, (req ,res, next)=>{
    console.log('hi3');
    next();
}, (req ,res, next)=>{
    console.log('hi4');
    next();
}, (req ,res, next)=>{
    console.log('hi5');
    next();
})

이렇게 체이닝할수도 있다. 근데 굳이?

 

 

# 에러처리

app.use((req, res, next)=>{
    console.log('all request')
    next();
}, (req ,res, next)=>{
    throw new Error('에러났옹 ㅠ')
}

먼저 에러생기게 만들어줬다. 

 

그럼 브라우저에

이렇게 서버컴퓨터상태를 다 알려줘버림 ㅋㅋㅋ 

 

그래서 이걸 안보여지게 처리하려면 이렇게 한다.

 

app.use((err,req,res,next)=>{
    console.error(err);
    res.status(200).send('에러낫어용ㅇㅇㅇㅇ')
})

이렇게 쓰면, 만약 에러가 났을때 서버 콘솔에는 에러메세지 띄워주고

브라우저 클라이언트들에게는 그냥 에러났어용 ㅇㅇㅇㅇ가 화면에 떠버린다 ㅎㅎ

그리고 또 클라이언트가 무슨에러인지 아는방법중 하나인

관리자도구에서 네트워크 상태를 볼 수 있는걸 막기위해서

status 200을 적으면 여기도 200으로 전달된다. 500적으면 500전달되고..

보통은 200을 많이 쓴다고 한다.

 

 

 

app.use((req, res, next)=>{
    console.log('all request')
    next();
}, (req ,res, next)=>{
    try{
        console.log(hello)
    } catch(error){
        next(error); //얘는 다음미들웨어로 넘어가는게 아니라 아랫쪽 에러처리미들웨어로 넘겨줌. next()빈괄호여야지 다음과정 넘어감
    }
}
)//cmd에 에러메세지 뜸 ㅋ
// 이게 브라우저에 뜨므로 에러처리 미드웨어를 씀.

이렇게 보통은 에러처리를 하는데 저 코드에선 콘솔로그에 hello를 따옴표안씌워줘서 에러뜨게했다.

그럼 next(error)을 캐치에 넣어주면

저 에러가 에러처리 미들웨어(젤아랫쪽에 있는)로 넘어간다.

 

 

 

미들웨어 라우터 분리.

app.get('/', (req,res,next)=>{
    res.sendFile(path.join(__dirname, 'index.html'));
    if(false){
        next('route') // 여기서 아래 app.get으로 넘어감.
    } else{
        next()
    }
}, (req,res)=>{ // 여기말고 아래 app.get
    console.log('라우트처리한거.')
})

app.get('/',(req,res)=>{
    console.log('슬래시 들어왔네용')
    res.send('라우트 처리 안한거.')
})

 

같은 슬래시로 app.get요청이 두개이다. 그렇다면 이중 하나가 실행될텐데

위쪽 라우터부터 실행되려한다.

근데 만약 if조건이 false가 들어가면 라우트처리가 어떻게될까?

next('route')는 이어진 미들웨어말고 다른 app.get으로 연결해준다.

이렇게 분리하면서쓰면됨ㅇㅇ