Express.js에서 미들웨어는 요청(req), 응답(res) 및 next라는 세 번째 매개변수에 액세스할 수 있는 특수 함수입니다. 일반 경로 핸들러와 달리 미들웨어는 기본 비즈니스 로직 이전에 외부 로직을 실행하여 애플리케이션 흐름을 제어하는 데 중요한 역할을 합니다.
미들웨어는 어떻게 작동하나요?
HTTP 요청이 Express.js 서버에 도달하면 일련의 미들웨어 기능을 통해 전달됩니다. 각 미들웨어는 다음을 수행할 수 있습니다.
- 요청 개체를 수정합니다(예: 데이터 첨부, 토큰 확인).
- 응답 개체를 수정합니다(예: 조기에 응답 보내기).
- next() 함수를 사용하여 스택의 다음 미들웨어에 제어를 전달합니다.
미들웨어가 next()를 호출하지 않으면 요청-응답 주기가 여기서 종료되고 더 이상 로직(라우트 핸들러 포함)이 실행되지 않습니다.
미들웨어를 사용하는 이유는 무엇입니까?
미들웨어는 요청을 처리하기 전에 재사용 가능한 논리를 추가해야 하는 시나리오에 적합합니다. 예를 들면 다음과 같습니다.
-
인증: 사용자가 로그인했는지 확인합니다(예: 유효성 검사 - JWT 토큰).
-
승인: 사용자에게 특정 작업을 수행하는 데 필요한 권한이 있는지 확인합니다(예: 관리자가 콘텐츠를 삭제할 수 있음).
-
검증 요청: 필수 입력이 모두 제공되었는지 확인합니다.
-
로깅 및 모니터링: 분석 또는 디버깅을 위해 들어오는 요청의 세부 정보를 기록합니다.
-
오류 처리: 의미 있는 응답을 보내기 위해 전역적으로 오류를 포착합니다.
미들웨어 정의 및 사용
미들웨어 기능은 다음과 같습니다.
-
req(요청): 들어오는 HTTP 요청에 대한 정보를 포함합니다(예: 헤더, 본문, 매개변수).
-
res(응답): 클라이언트에 데이터를 다시 보내는 데 사용됩니다.
next(): 라인의 다음 미들웨어에 제어권을 넘겨주는 함수입니다.
미들웨어 흐름: 실행 순서
미들웨어 순서가 중요합니다! Express는 정의된 순서대로 미들웨어를 순차적으로 실행합니다.
미들웨어가 경로 뒤에 정의되면 해당 경로에는 영향을 미치지 않습니다. 이것이 바로 app.js의 경로 이전에 미들웨어를 선언해야 하는 이유입니다.
예:
내부 실행 흐름
단계별 진행 상황은 다음과 같습니다.
-
수신 요청: 요청이 서버에 도달했습니다.
-
미들웨어 실행:
- 미들웨어는 req.user.role을 확인합니다.
- 역할이 "admin"인 경우 next()를 호출하여 다음 미들웨어나 경로로 제어권을 전달합니다.
- 그렇지 않은 경우 미들웨어는 403 Forbidden 응답을 보내 요청을 종료합니다.
-
라우트 핸들러: next()가 호출되면 해당 라우트 핸들러(예: /admin/dashboard)가 실행됩니다.
예제 흐름:
- "admin" 역할을 가진 사용자가 /admin/dashboard를 요청합니다.
- 미들웨어는 "액세스 허용"을 기록하고 next()를 호출합니다.
- 라우트 핸들러가 "관리 대시보드에 오신 것을 환영합니다!"를 보냅니다.
- "user" 역할을 가진 사용자가 /admin/dashboard를 요청합니다.
- 미들웨어는 "액세스 거부됨"을 기록하고 "이 리소스에 대한 액세스 권한이 없습니다"를 보냅니다.
주요 시사점
- 미들웨어는 게이트키퍼와 같습니다. 기본 경로 로직이 실행되기 전에 무슨 일이 일어날지 결정합니다.
- 다음 미들웨어나 경로로 흐름이 계속되도록 하려면 next()를 사용하세요.
- 항상 경로를 적용하기 전에 중요한 미들웨어를 정의하여 적용하세요.
- next()를 호출하지 않거나 응답을 보내지 않으면 요청이 중단됩니다(시간 초과).
위 내용은 Express.js의 미들웨어와 내부 작업 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!