express 비동기 함수 이상 포획 예시 상세
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);
});~~~~
참조 링크:이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백과 처리콜백이란, 말 그대로 나중에 실행되는 코드를 말합니다. 일반적인 화살표 함수에서, {} 부분이 콜백에 해당된다고 볼 수 있습니다. 이벤트 중심 언어인 자바스크립트는 다음과 같이 여러 함수를 입력했을 때, 결과를 기다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.