사용자 정의 노드 구축/Express 오류 처리 중간부품

8561 단어 nodejavascript
어떤 API에서든 오류 처리는 필요하고 매우 중요한 부분이다.Express의 오류 처리 중간부품은 오류 처리를 간단하고 깨끗하게 하고 매우 선진적이고 유용한 오류 처리 도구를 유연하게 만들 수 있습니다!일반적인 단순 프로세서는 다음과 같습니다.
...
// This will always throw an error
app.get('*', (req, res, next) => {
   throw new Error('An Error Occurred')
})
// This should catch that error and handle it
app.use( (err, req, res, next) => {
    // Maybe some logging here...
    res.status( 500 ).send({ message: err.message })
})
...

이거 대박!모든 오류는 이 처리 프로그램에 나타나야 하며, 사용자에게 500개의 상태 코드를 포함하는 멋진 오류 메시지를 되돌려야 한다.그러나 중앙 오류 처리 프로그램에서 오류를 어떻게 처리하는지 더 세밀하게 제어하려면 어떻게 해야 합니까?사용자 정의 오류 처리와 로그 기록을 제공할 수 있도록 조직 오류 처리 논리를 보여 줍니다. 이러한 오류 처리와 로그 기록은 특정 유형의 오류에 따라 다를 수 있습니다.

조직 처리 프로그램


우리는 무수한 방법으로 처리 프로그램의 논리를 조직할 수 있다.이 예제에서는 프로세서의 관심사를 두 개의 다른 파일로 나눕니다.
/app
   index.js
   /util
     /errorHandler
        errors.js
        index.js
        reducer.js

  • index.js 어플리케이션 준비 및 시작을 위한 API 기본 파일
  • /util 이 폴더에는 유틸리티 모듈이 포함되어 있습니다. (이 예에서는 오류 처리만 가능합니다.)
  • /util/errorHandler에는 오류 처리 프로그램의 중간부품 파일이 포함된 폴더가 있습니다.
  • index.js 우리의 오류 처리 프로그램의 메인 파일입니다.이것은 중간부품 기능을 제공하여 오류를 포착하고 모든 오류가 실행해야 하는 정의 작업에 응답할 수 있다.
  • reducer.js 이것은 reducer 함수를 제공합니다. 이 함수는 입력에 따라 어떤 내용을 응답하는지 정의합니다.일부 오류가 발생했을 때 API에 응답하는 사용자를 결정하는 데 사용됩니다.
  • errors.js 이 파일은 우리가 캡처할 사용자 정의 오류를 정의하는 JSON 맵일 뿐입니다.이러한 작업은 Redux와 유사합니다.
  • 기본 오류 처리


    이제 우리는 응용 프로그램과 오류 처리 프로그램을 어떻게 구성하는지, 우리가 이 기초 위에서 구축할 수 있도록 오류 처리 프로그램을 설정하는 방법을 알게 되었다.이를 위해, 우리는 우선 /utils/errorHandler/index.js에서 실제 오류 처리 프로그램의 중간부품 함수를 만들 것이며, 응용 프로그램의 기초 위에서 이 함수를 제공하여 사용하여 발생하는 모든 오류를 포착할 수 있도록 할 것이다.
    // Handler for errors
    module.exports = (err, req, res, next) => {
        // Send the error response
        res.status( 500 ).json({ error: err.message })
    }
    
    
    이게 기본이야!이것은 모든 오류를 포착하고 오류 메시지를 되돌려줍니다. 오류 상태는 500입니다.이제 express에서 이 중간부품을 사용하여 오류를 포착할 수 있습니다.이것은 시작 응용 프로그램의 주 index.js입니다.
    const
        express = require('express'),
        app = express(),
        errorHandler = require('./utils/errorHandler')
    
    // Sets up some routes to play with
    app
        .get('*', (req, res, next) => {
            throw new Error(`Oof, I broke...`)
        })
        .post('*', (req, res, next) => {
            res.json({ message: 'No breakage here!'})
        })
    
    // NOTE: We apply our errorHandler middleware LAST so that it can catch any bubbling errors
    app.use(errorHandler)
    
    // Start up the app
    app.listen( 3000, () => console.log(`Let's catch these errors...`))
    
    
    주의, 우리는 응용 프로그램에 모든 다른 중간부품과 루트를 사용한 후에 errorHandler 중간부품을 사용하라고 알려 줍니다.이것은 처리 프로그램이 위의 함수에서 발생한 모든 오류를 포착하도록 하기 위해서이다.
    우리 두 단점을 테스트해서 우리가 무엇을 얻었는지 봅시다.

    Here we GET the root of the API which generates an error. Notice the 500 error status!



    Here we POST to the root of the API which completes successfully. Notice the 200 success status!


    이것은 Express의 오류 처리 프로그램 중간부품을 사용하여 오류 처리를 하는 가장 기본적인 예이다.이 설정을 사용하면 항상 500 상태를 생성하고 오류 메시지를 되돌려줍니다.로그 기록이 없고 다른 처리가 없습니다.이것은 확실히 효과가 있지만, 우리는 더욱 잘 할 수 있다.우리 일을 좀 재미있게 합시다.

    사용자 정의 오류 처리


    이제 우리는 오류를 포착하고 처리할 수 있다. 우리는 오류 처리 프로그램으로 무엇을 할 수 있는지, 예를 들어 조작 오류 (코드의 오류로 인한 오류가 아니다), 기록 오류 등등...
    오류 처리 수준에 도달하기 위해서, 우리는 먼저 몇 가지 논리를 놓아서, 우리가 던진 오류에 따라 서로 다른 오류 코드와 응답을 보낼 수 있도록 허용할 수 있다.어떤 경우, 우리는 500 이외의 상태나 잘못된 메시지 이외의 메시지를 보내기를 원할 수도 있습니다. 우리는 아래에서 그 중 하나를 소개할 것입니다.이를 위해 Redux의 reducer과 같은 감속기를 만듭니다.오류를 수신하고 오류가 무엇인지에 따라 발송할 상태와 메시지를 결정하며 처리 프로그램에 오류를 기록할지 알려 줍니다.
    오류 처리 프로그램의 감속기가 이 오류를 처리하기 위해 무엇을 찾아야 하는지 정의하기 위해 errors.js 파일에 사용자 정의 오류를 설정합니다.이것들은 Redux의 actions과 유사할 것이다.
    module.exports = {
        CORS_ORIGIN: 'cors/origin'
    }
    
    
    설탕의를 함유한다이제 권한이 부여되지 않은 소스에서 API에 액세스하려고 할 때 CORS_ORIGIN 오류가 발생합니다.이를 위해, 우리는 cors/origin의 값을 가진 오류를 던져야 한다.
    // index.js
    const cors = require('cors')
    
    const whitelist = [
        'http://authorized-origin.com'
    ]
    
    const corsOptions = {
        origin: (origin, callback) => {
            if (whitelist.indexOf(origin) !== -1) {
              callback(null, true)
            } else {
              callback(new Error(`cors/origin`))
            }
        }
    }
    
    ...
    
    app.get('/cors', cors(corsOptions), (req, res, next) => {
        // This is the message that gets returned if the cors check passes!
        res.json({ message: 'CORS check passed successfully!'})
    })
    
    
    다음은 이 오류를 포착하기 위해 감속기를 설치합시다.
    // reducer.js
    const errors = require('./errors')
    
    // Default Error Details
    const defaultDetails = {
        status: 500,
        message: 'Something failed!',
        logError: true
    }
    
    // Defines how to handle individual errors (typically will be used for special cases)
    module.exports = err => {
        switch ( err.message ) {
            // Handle CORS errors
            case errors.CORS_ORIGIN:
                return {
                    ...defaultDetails,
                    status: 400,
                    message: 'Not authorized by CORS',
                    logError: false
                } 
            // Handle the default action   
            default: 
                return defaultDetails 
        }
    }
    
    
    위의 코드에서 기본 오류 상세 정보를 설정했습니다.이 "reducer"함수에 전달된 오류가 정의된 오류와 일치하지 않으면 기본값만 되돌려줍니다.사례와 일치하면 오류에 대한 자세한 정보를 되돌려줍니다.
    우리는 이유 코드 문제로 생성된 오류나 생성된 오류 메시지를 제공하는 오류, 개발자가 정의한 사용자 정의 오류를 처리하기 위해 이런 방식으로 그것을 작성합니다.이것은 우리가 사용자에게 통지하고자 하는 사용자의 입력 오류일 수 있습니다.
    이 함수가 있으면 오류 처리 프로그램 파일에reducer 함수를 가져와 API 사용자에게 응답을 보낼 것인지 확인할 수 있습니다.
    // /util/errorHandler
    const reducer = require('./reducer')
    
    // Handler for errors
    module.exports = (err, req, res, next) => {
        // Get the error response details relevant to this error
        let { status, message, logError } = reducer( err )
    
        // Should I log this error?
        if ( logError ) {
            // You could add custom logging here.
            // For simplicity, I am just console logging
            console.log({
                message: err.message,
                stack: err.stack,
                method: req.method,
                path: req.path
            })
        }
    
        // Send the error response
        res.status( status ).json({ error: message })
    }
    
    
    이제 특정 오류에 대한 사용자 정의 오류 상세 정보를 정의할 수 있습니다!네가 여섯 번째 줄에서 보듯이 우리는 오차를 감속기에 전달한다.reducer는 던져진 오류에 따라 어떤 세부 사항을 되돌려줄지 결정하고, 상태 코드와 오류 메시지를 확인하고, 오류를 기록할지 결정합니다. (현재는 컨트롤러에 기록만 하고 있습니다.)

    NOTE : We are using object destructuring to pull out the data we want from the reducer’s return value.


    이 기능이 있으면 CORS가 오류의 출처를 포착할 때 사용자 정의 오류 응답을 얻을 수 있습니다!

    Here we request the API with the authorized origin so we get a success!



    This request was from an unauthorized origin, so the CORS_ORIGIN error was thrown! Notice the 400 response and custom error message


    설탕의를 함유한다이제 사용자 정의 오류를 더 많이 설정하고 어떻게 처리하는지 정의할 수 있습니다!이런 구조를 사용하면 우리는 특정한 유형의 오류를 분석하고 오류에 따라 서로 다른 위치에 기록하는 방법을 세울 수 있다.

    결론


    이것은 단지 중간부품을 조직하고 잘못 처리하는 많은 방법 중의 하나일 뿐이다.이를 바탕으로 오류 처리 프로그램은 많은 기능에 유연하게 서비스를 제공할 수 있습니다. 이 기능들은 오류를 디버깅하고 기록하는 데 도움이 되고 실패한 요청 상황을 API 사용자에게 정확하게 알려줍니다.
    읽어주셔서 감사합니다. 실수를 포착하세요!

    좋은 웹페이지 즐겨찾기