|익스프레스| 익스프레스: 오류 처리

             -Express Built-In Error Handler 
             -Defining Custom Error Handlers 
             -Our Custom Error Class 
             -Handling Async Errors
             -Handling More Async Errors
             -Defining An Async Utility 

익스프레스 내장 오류 처리기



Express 애플리케이션 내에서 발생하는 대부분의 일반적인 오류는 불완전한 데이터, 데이터베이스, API, 외부 서비스 및 라이브러리와의 연결 또는 상호 작용 문제로 인해 발생할 수 있습니다. 또한 최종 사용자는 우발적 또는 의도적으로 응용 프로그램 내에서 알려지지 않은 버그를 발견할 수 있습니다.



오류가 의도적으로 발생했거나 명시적이지 않은 경우 오류를 포착하고 자체 내장된 오류 처리 기능으로 응답합니다. Express는 기본적으로 상태 코드 500을 사용하지만 상태 코드를 변경할 수 있습니다. 오류 응답에는 개발자 모드에 있을 때 스택 추적도 포함됩니다.

사용자 지정 오류 처리기 정의





사용자 지정 오류 처리기를 작성하려면 err, req, res, next의 네 가지 함수가 필요합니다. 코드 내의 모든 app.use 문 뒤에 마지막에 넣어야 합니다.


app.use(function (err, req, res, next) {
  console.error(err.stack) 
  res.status(500).send('Something broke!') 
})



맞춤형 오류 클래스



상태 코드와 응답으로 오류에 응답해야 합니다. Express에서 작업할 때 프로세스를 달성하는 방법에는 여러 가지가 있습니다. 응답을 템플릿과 함께 사용하여 더 많은 정보를 추가할 수 있습니다.
일반적인 메시지는 서버 측에서 문제가 발생했음을 의미하는 상태 코드 오류 500일 수 있습니다. 상태 코드 401은 승인되지 않았거나 승인되지 않았음을 의미합니다.

비동기 오류 처리



이 코드는 개념적 연습을 위한 것일 뿐이며 프로젝트나 애플리케이션의 일부가 아닙니다.


app.get('/products/new', (req, res) => {
   throw new AppError('Not Allowed, 401) 
   res.render('products/new', { categories }) 
})




app.use((err, req, res, next) => {
   const {status = 500, message = 'Something went wrong'} = err;
   res.status(status).send(message); 
})




app.get('/products/:id', async (req, res) => {
   const { id } = req.params; 
   const product = await Product.findById(id) 
   if (!product) {
        throw new AppError('Product Not Found, 404) 
   }
 res.render('products/show', { product }) 
})



더 많은 비동기 오류 처리



비동기 오류를 처리하려면 try/catch 문을 사용해야 합니다.

이 코드는 개념적 연습을 위한 것일 뿐이며 프로젝트나 애플리케이션의 일부가 아닙니다.

app.post('/products', async (req, res) => {
   try {
     const newProduct = new Product(req.body); 
     await newProduct.save(); 
     res.redirect(`/products/${newProduct._id}`)
  } catch(e) {
    next(e);
}

})


app.get('/products/:id', async (req, res, next) => {
  try {
   const { id } = req.params;
   const product = await Product.findById(id)
   if (!product) {
     throw new AppError('Product Not Found', 404); 
   }
   res.render('/products/show', { product })
} catch (e) {
   next(e);
}
})










비동기 유틸리티 정의



try/catch를 사용하는 것보다 오류를 처리하는 더 좋은 방법이 있습니다. 오류를 포착할 비동기 콜백을 래핑하는 함수 만들기.


function wrapAsync(fn) {
  return function(req, res, next) {
   fn(req, res, next).catch(e => next(e))
  }
} 



app.get('/products/:id', wrapAsync(async, req, res, next) => {
   const { id } = req.params;
   const product = await Product.findById(id)
   if (!product) {
     throw new AppError('Product Not Found', 404); 
   }
   res.render('/products/show', { product })

}
})


좋은 웹페이지 즐겨찾기