express 비동기 함수 이상 포획 예시 상세

3826 단어 비동기이상포획
express에서 Async/await를 사용하여 비동기 코드를 작성할 때 모든 async 함수는try/catch에 감싸야 합니다. 코드량이 많으면 쓸데없는 우아하지 않고 express는koa의 비동기 메커니즘처럼 전역의 error 이벤트를 구독할 수 없습니다. 이 문제를 해결하기 위해서는 비동기 함수 이상을 포착하는 중간부품을 써야 합니다.

uncaughtException


처음에 생각할 수 있는 것은try/catch가 틀림없지만, nodejs가 제공하는 uncaught Exception 이벤트를 사용하여 전역적으로 이상을 포착할 수 있을지 생각해 봤습니다. 예를 들어 아래의 코드:

process.on("uncaughtException", (err) => console.log("uncaught Exception"));

const asyncError=()=>{
 throw new Error("some Error");
}

asyncError();
asyncError 방법에서 던진 이상은 uncaughtException에 구독되지만 비동기 함수에서 uncaughtException에 도착하지 않으면 이상이 발생합니다.

process.on("uncaughtException", (err) => console.log("uncaught Exception"));

const asyncError=()=>{
 throw new Error("some Error");
}

(async ()=>{
 //  
 asyncError();
})()

그리고 약속.reject도 uncaught Exception에 들어가지 않았습니다.

const asyncError=()=>{
 return Promise.reject("some error")
}

(async ()=>{
 //  
 await asyncError();
})()

따라서 express에서 nodejs가 제공하는 uncaught Exception을 사용하여 비동기 오류를 처리하는 것은 적합하지 않습니다. 한편으로는 상하문 오류를 포획하고 포지셔닝할 수 없고, 다른 한편으로는 오류 이상을 중간부품 함수 처리에 제공할 수 없습니다.

사고방식을 해결하다


express의 비동기 함수 오류를 처리하려면 가장 좋은 방법은 이상한 중간부품을 작성하여 처리하는 것입니다. try/catch 길을 열고 중간부품을 감싸는 방법,catch에서 온 이상은 넥스트 함수에 직접 처리하고 코드는 다음과 같습니다.

 const asyncHandler = fn =>{
 return (req,res,next)=>{
  try{
   fn(req,res,next)
  }catch(next)
 }
}
module.exports = asyncHandler;
다음은 비동기 함수에 중간부품 처리를 도입합니다.

app.use(asyncHandler(async(req, res, next) => {
 await authenticate(req);
 next();
}));

app.get('/async', asyncHandler(async(req, res) => {
 const result = await request('http://example.com');
 res.end(result);
}));
asyncHandler 방법으로 감싸는 async/await 함수, 오류가 발생하면 Error-handling 중간부품에 포착됩니다
하지만 매번 비동기 함수를 사용할 때마다 asyncHandler 방법을 감싸야 하기 때문에 실제로 사용해도 시원치 않으니 사용하시는 것을 추천합니다express-async-errors 중간부품, 그 원리는 express 안의 중간을 모두 한 층 감싸는 asyncHandler 방법으로 오류를 숨길 곳이 없이 모두 Error-handling 중간부품으로 보내는 것이다.
전제는 express를 도입한 후에 express-async-errors 방법을 도입하는 것이다.

const express = require('express');
require('express-async-errors');
const User = require('./models/user');
const app = express();

app.get('/users', async (req, res) => {
 const users = await User.findAll();
 res.send(users);
});

다음은 비동기 함수에서try/catch를 감싸지 않아도 됩니다. 오류가 있으면throw Error를 앞당겨 코드를 작성합니다.

app.use(async (req, res) => {
 const user = await User.findByToken(req.get('authorization'));

 if (!user) throw Error("access denied");
});

app.use((err, req, res, next) => {
 if (err.message === 'access denied') {
 res.status(403);
 res.json({ error: err.message });
 }

 next(err);
});~~~~

참조 링크:
  • Using Async/await in Express
  • Handling errors in express async middleware
  • 이 express 비동기 함수 이상 포획 예시에 관한 글은 여기에 소개되었습니다. 더 많은 express 비동기 함수 이상 포획 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기