Express PlatoBlockchain Data Intelligence의 예외 처리 가이드. 수직 검색. 일체 포함.

Express의 예외 처리 가이드

개요

예외 및 오류는 사용자가 응용 프로그램과 상호 작용하는 동안 발생하기 마련입니다. 발생 가능한 모든 오류를 고의적으로 또는 무의식적으로 처리하는 방법을 선택하는 것은 소프트웨어 엔지니어에게 달려 있습니다. 결과적으로 Express로 API를 구축하는 백엔드 개발자는 유용하고 효율적이며 사용 가능한 API를 구축하기 위해 노력하고 있음을 알게 됩니다. 가장 중요한 것은 개발 시간, 명백한 오류, 생산성 문제를 줄이는 데 도움이 되고 소프트웨어 개발의 성공 또는 확장성을 결정하는 데 도움이 되기 때문에 견고한 시스템을 구축하는 방식으로 오류를 처리하는 것입니다.

오류 메시지를 기록하거나, 오류를 억제하거나, 사용자에게 오류에 대해 알리거나, 오류를 처리하는 코드를 작성해야 합니까? 더 이상 궁금해.

이 가이드에서는 Express 애플리케이션을 위한 강력한 오류 처리 코드베이스를 구축하는 방법을 알아봅니다. 이 코드베이스는 애플리케이션 오류를 감지하는 데 도움이 되고 런타임 중에 정상적으로 실패하는 애플리케이션을 복구하기 위한 최적의 조치를 취하는 데 도움이 됩니다.

참고 : Postman을 사용하여 데모에서 API를 테스트할 것입니다. 에서 다운로드 할 수 있습니다. 우편 배달부 다운로드 페이지. 또는 단순히 브라우저, 명령줄을 사용할 수 있습니다. curl 도구 또는 친숙한 다른 도구.

오류 처리란 무엇입니까?

소프트웨어 개발에는 두 가지 종류의 예외가 있습니다. 운영프로그래밍 방식의.

  • 런타임 중에 운영 실패가 발생할 수 있으며 애플리케이션이 갑자기 종료되는 것을 방지하기 위해 효율적인 오류 처리 방법을 통해 이러한 예외를 정상적으로 처리해야 합니다.
  • 프로그래밍 예외는 예외 상태가 발생할 때 프로그래머가 수동으로 throw합니다.

운영 예외는 "예기치 않았지만 예견된" 예외(예: 범위를 벗어난 인덱스 액세스)로, 프로그래밍 예외는 "예상 및 예견된" 예외(예: 숫자 서식 예외)로 생각할 수 있습니다.

예외 처리는 프로그램 내에서 결함을 찾아 수정하는 데 사용되는 절차입니다. 오류 처리는 발생한 오류 유형과 오류가 발생한 스택을 포함하는 메시지를 보냅니다.

참고 : 컴퓨터 과학에서 예외는 복구 가능하며 일반적으로 런타임 동안 운영 또는 프로그래밍 문제에서 발생합니다. 오류는 일반적으로 하드웨어 제한, 연결 문제, 메모리 부족 등과 같은 외부 요인에서 발생합니다. JavaScript에서 용어는 종종 같은 의미로 사용되며 사용자 지정 예외는 다음에서 파생됩니다. Error 수업. 그만큼 Error 클래스 자체는 오류와 예외를 모두 나타냅니다.

Express에서 예외 처리는 Express가 동기 및 비동기 예외를 포착하고 처리하도록 설정하는 방법을 나타냅니다. Express의 예외 처리에 대한 좋은 점은 개발자로서 자신의 예외 처리기를 작성할 필요가 없다는 것입니다. Express는 기본 예외 핸들러와 함께 제공됩니다. 예외 처리기는 오류를 식별하고 사용자에게 보고하는 데 도움이 됩니다. 또한 다양한 수정 전략을 제공하고 이를 구현하여 예외를 완화합니다.

내부적으로 많은 일이 진행되는 것처럼 보일 수 있지만 Express의 예외 처리는 프로그램의 전체 프로세스를 느리게 하거나 실행을 일시 중지하지 않습니다.

Express의 예외 처리 이해

Express와 함께 제공되는 기본 오류 핸들러를 사용하면 경로 핸들러의 오류를 자동으로 포착하는 데 도움이 되는 일련의 미들웨어 기능을 손에 넣을 수 있습니다. 곧 Express 앱에서 적절한 오류를 반환하는 방법과 민감한 정보를 유출하지 않는 방법에 대한 이론을 실천하는 프로젝트를 만들 것입니다.

Express에서 미들웨어 기능 정의

오류 처리 미들웨어 기능은 다음을 허용하는 방식으로 정의됩니다. Error object를 첫 번째 입력 매개변수로 지정하고 그 뒤에 다른 미들웨어 함수의 기본 매개변수를 지정합니다. request, responsenext. 그만큼 next() 함수는 모든 현재 미들웨어를 라우터의 다음 오류 처리기로 건너뜁니다.

Express에서 오류 처리 설정

터미널에서 다음 명령을 실행하여 Node 및 Express 앱을 만듭니다.

$ mkdir error-handling-express

새로 생성된 폴더에서 새 노드 프로젝트를 초기화해 보겠습니다.

$ cd error-handling-express && npm init -y

이렇게하면 package.json 우리 폴더에 있는 파일.

Node 앱에서 Express 서버를 만들려면 다음을 설치해야 합니다. express 패키지 dotenv 환경 변수를 자동으로 로드하기 위해 .env ~에 파일을 넣다 process.env 개체, 그리고 nodemon 디렉터리에 파일 변경 사항이 기록된 경우 노드 앱을 다시 시작하기 위한 것입니다.

$ npm install express dotenv nodemon

다음으로 생성 app.js 앱의 인덱스 파일로 사용할 프로젝트 폴더의 파일입니다.

이제 Express 앱에 필요한 모든 종속 항목을 설치했으므로 다음에서 앱을 읽기 위한 스크립트를 설정해야 합니다. package.json 파일. 이를 달성하기 위해 package.json 파일, 그래서 scripts 객체는 아래와 같습니다.

"scripts": {
    "start": "nodemon app.js"
},

또는 다음을 사용하여 건너뛸 수 있습니다. nodemon사용 node app.js 대신.

익스프레스 서버 설정

서버를 설정하려면 먼저 다양한 패키지를 app.js. 우리는 또한 .env 프로젝트 디렉터리의 파일 – 애플리케이션에 대한 모든 환경 변수 저장:



const express = require('express')
require('dotenv').config

PORT=4000 

다음에서 앱의 포트 번호를 정의했습니다. .env에 의해 로드되고 읽혀집니다. dotenv, 나중에 액세스할 수 있습니다.

익스프레스 서버 초기화

이제 Express 서버를 초기화하고 앱이 테스트 경로에 대한 요청과 함께 앱 포트 번호를 수신하도록 해야 합니다. /test. 업데이트하자 app.js, 가져오기 문 아래:


const app = express();
const port = process.env.PORT || 4000;

app.get("/test", async (req, res) => {
    return res.status(200).json({ success: true });
});

app.listen(port, () => {
    console.log(`Server is running at port ${port}`);
});

이제부터 Express에서 접할 수 있는 동작상의 오류에 대한 다양한 유즈케이스를 어떻게 처리하는지 알아보겠습니다.

Express에서 찾을 수 없는 오류 처리

사용자 데이터베이스에서 모든 사용자를 가져와야 한다고 가정하면 로직을 try/catch 블록 – 프로젝트에 나타날 수 있는 모든 오류를 잡기를 희망 catch 블록 :


const getUser = () => undefined;

app.get("/get-user", async (req, res) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error('User not found');
		}
	} catch (error) {
	    
		console.log(error); 
		
		res.status(400).send(error.message) 
	}
	return res.status(200).json({
		success: true
	});
});

결과 :

User not found

이제 이 요청이 이루어지고(Postman을 사용하여 테스트할 수 있음) 데이터베이스에 사용자가 없으면 클라이언트는 "사용자를 찾을 수 없음"이라는 오류 메시지를 받습니다. 또한 오류가 콘솔에도 기록되었음을 알 수 있습니다.

오류 처리기 미들웨어로 오류 처리 최적화

정의된 모든 경로의 끝에 오는 오류 처리기 미들웨어를 생성하여 개발을 최적화할 수 있으므로 경로 중 하나에서 오류가 발생하면 Express가 자동으로 다음 미들웨어를 살펴보고 목록 아래로 계속 내려갑니다. 오류 처리기에 도달할 때까지. 오류 처리기는 오류를 처리하고 클라이언트에 응답을 다시 보냅니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

시작하려면 다음 폴더를 만듭니다. middleware 프로젝트 디렉토리와 이 폴더에 다음과 같은 파일을 생성합니다. errorHandler.js 오류 처리기를 정의합니다.

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

미들웨어 기능에서 우리는 이것이 기본 미들웨어 기능이 아니라 오류 처리기라는 것을 Express가 인식하도록 했습니다. error 3개의 기본 매개변수 앞의 매개변수.

이제 데모에서 오류 처리기를 사용하겠습니다. app.js 아래와 같이 오류 처리기 미들웨어를 사용하여 사용자를 가져오는 초기 오류를 처리합니다.


const getUser = () => undefined;

app.get("/get-user", async (req, res, next) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
	} catch (error) {
		return next(error);
	}
});

app.use(errorHandler);

주변에 추상화를 생성하여 코드를 더욱 최적화할 수 있습니다. try/catch 논리. 라는 프로젝트 디렉토리에 새 폴더를 생성하여 이를 달성할 수 있습니다. utils, 그 안에 라는 파일을 만듭니다. tryCatch.js.

추상화하려면 try-catch 논리 - 다른 함수를 허용하는 함수를 정의할 수 있습니다( 제어 장치)를 매개변수로 사용하고 다음을 반환합니다. async a를 보유할 함수 try/catch 수신된 모든 컨트롤러에 대해.

컨트롤러에서 에러가 발생하면, catch 블록하고 다음 함수가 호출됩니다.


const tryCatch = (controller) => async (req, res, next) => {
	try {
		await controller(req, res);
	} catch (error) {
		return next(error);
	}
};
module.exports = tryCatch;

와 더불어 try/catch 추상화, 우리는 코드를 리팩토링하여 더 간결하게 만들 수 있습니다. try-catch 절에서 사용자를 가져올 때 명시적으로 app.js:


const getUser = () => undefined;

app.get(
	"/get-user",
	tryCatch(async (req, res) => {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
		res.status(400).send(error.message);
	})
);

우리는 성공적으로 try-catch 논리를 추상화했으며 코드는 여전히 이전처럼 작동합니다.

Express에서 유효성 검사 오류 처리

이 데모에서는 로그인 시 사용자 ID를 확인하기 위해 Express 앱에 로그인을 위한 새 경로를 생성합니다. 먼저 다음을 설치합니다. joi 요구 사항을 적용할 수 있는 스키마를 만드는 데 도움이 되는 패키지:

$ npm i joi

다음으로 스키마를 생성합니다. Joi.objectuserId 이는 숫자여야 하며 필수입니다. 즉, 요청이 사용자 ID가 있는 개체와 일치해야 합니다.

우리는 사용할 수 있습니다 validate() 스키마에 대한 모든 입력의 유효성을 검사하는 스키마 개체의 메서드:


const schema = Joi.object({
	userId: Joi.number().required(),
});

app.post(
	"/login",
	tryCatch(async (req, res) => {
		const {error, value} = schema.validate({});
		if (error) throw error;
	})
);

빈 객체가 전달되면 validate() 메서드를 사용하면 오류가 정상적으로 처리되고 오류 메시지가 클라이언트로 전송됩니다.

콘솔에서 우리는 또한 details 필요한 경우 사용자에게 전달할 수 있는 오류에 대한 다양한 세부 정보를 포함하는 배열입니다.

유효성 검사 오류당 적절한 오류 세부 정보를 전달하는 방식으로 유효성 검사 오류를 구체적으로 처리하기 위해 오류 처리기 미들웨어를 리팩터링할 수 있습니다.


const errorHandler = (error, req, res, next) => {
	console.log(error); 

	if (error.name === "ValidationError") {
		return res.status(400).send({
			type: "ValidationError",
			details: error.details,
		});
	}

	res.status(400).send(error.message); 
};

module.exports = errorHandler;

errorHandler.js 이제 사용자 지정되었습니다. 빈 개체를 사용하여 동일한 요청을 validate() 방법:

Express PlatoBlockchain Data Intelligence의 예외 처리 가이드. 수직 검색. 일체 포함.

이제 더 읽기 쉽고 친숙한 방식으로 메시지를 반환하는 사용자 지정 개체에 액세스할 수 있습니다. 이러한 방식으로 들어오는 오류의 종류에 따라 다른 종류의 오류를 보내고 처리할 수 있습니다.

결론

이 가이드에서는 기본적으로 동기 및 비동기 코드를 처리하는 방법, 고유한 오류 클래스를 만드는 방법, 사용자 정의 오류 처리 미들웨어 기능을 작성하고 제공하는 방법을 포함하여 Express.js 오류 처리의 모든 측면을 검토했습니다. next 최종 캐치 핸들러로

모든 작업과 마찬가지로 효과적인 오류 처리를 포함하는 개발 중 모범 사례도 있으며 오늘 우리는 Express 앱의 오류를 강력한 방식으로 처리하는 방법을 배웠습니다.

오류를 올바르게 처리한다는 것은 버그와 오류를 쉽게 찾아 개발 시간을 줄이는 것뿐만 아니라 대규모 애플리케이션을 위한 강력한 코드베이스를 개발하는 것을 의미합니다. 이 가이드에서는 운영 오류를 처리하기 위해 미들웨어를 설정하는 방법을 살펴보았습니다. 오류 처리를 개선하는 몇 가지 다른 방법에는 스택 추적을 보내지 않음, 포착되지 않은 예외를 처리하기 위해 프로세스를 정상적으로 중지, 적절한 오류 메시지 제공, 오류 로그 보내기 및 Error 클래스입니다.

이 튜토리얼에서 사용한 예제가 여러분에게 즐거웠기를 바랍니다. 오류 관리에 대한 실제 사용을 위해 Express 애플리케이션을 작성할 때 잠재적으로 발생할 수 있는 다양한 시나리오를 다루었습니다. 내가 놓친 것이 있으면 알려주세요. 그것은 우리에게 도움이 될 것이고 내가 더 많은 것을 배우는 데 도움이 될 것입니다. 좋은 하루 보내시고 읽어주셔서 감사합니다.

에 대한 기사에서 사용된 모든 소스 코드를 참조할 수 있습니다. 깃허브.

추가 자료

타임 스탬프 :

더보기 스택카부스