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으로 연결해준다.
이렇게 분리하면서쓰면됨ㅇㅇ