Express에서 오류 처리

26444 단어 nodeexpress
내가 Express를 배우기 시작했을 때, 나는 오류를 어떻게 처리하는지 배우기가 매우 어려웠다.아무도 내가 필요로 하는 답안을 쓰지 않은 것 같아서 나는 어쩔 수 없이 힘든 방식으로 공부했다.
오늘 Express 응용 프로그램에서 오류를 처리하는 데 대해 알고 있는 모든 것을 공유하고 싶습니다.
동기화 오류부터 시작합시다.

동기화 오류 처리


동기화 오류를 처리하는 경우 throw Express Request Processor에서 오류를 처리할 수 있습니다.(주의: 요청 처리 프로그램은 컨트롤러라고도 부른다. 나는 요청 처리 프로그램을 현식이고 이해하기 쉽기 때문에 더 좋아한다.
app.post("/testing", (req, res) => {
  throw new Error("Something broke! 😱");
});
이러한 오류는 Express 오류 처리 프로그램을 통해 캡처할 수 있습니다.사용자 정의 오류 처리 프로그램을 작성하지 않은 경우 Express는 기본 오류 처리 프로그램을 사용하여 오류를 처리합니다.
Express의 기본 오류 처리 절차는 다음과 같습니다.
  • HTTP 상태를 500
  • 으로 설정
  • 요청자
  • 에게 텍스트 응답 보내기
  • 콘솔
  • 에 텍스트 응답 기록


    비동기 오류 처리


    비동기 오류를 처리하려면 next 파라미터를 통해express 오류 처리 프로그램에 오류를 보내야 합니다.
    app.post("/testing", async (req, res, next) => {
      return next(new Error("Something broke again! 😱"));
    });
    

    Express 응용 프로그램에서 Async/await를 사용하려면 express-async-handler 라는 포장 함수를 사용해야 합니다.try/catch 블록을 사용하지 않고 비동기 코드를 작성할 수 있습니다.나는 "Using Async/await in Express"에 이 방면에 관한 내용을 더 많이 썼다.
    const asyncHandler = require("express-async-handler");
    
    app.post(
      "/testing",
      asyncHandler(async (req, res, next) => {
        // Do something
      })
    );
    
    요청 처리 프로그램을 express-async-handler 포장하면 이전처럼 throw 오류를 처리할 수 있으며, 빠른 오류 처리 프로그램이 처리할 것입니다.
    app.post(
      "/testing",
      asyncHandler(async (req, res, next) => {
        throw new Error("Something broke yet again! 😱");
      })
    );
    

    사용자 정의 오류 처리 프로그램 작성


    Express 오류 처리 프로그램에는
  • error
  • req
  • res
  • next
  • 그것들은 반드시 너의 모든 중간 제품과 노선 뒤에 두어야 한다.
    app.use(/*...*/);
    app.get(/*...*/);
    app.post(/*...*/);
    app.put(/*...*/);
    app.delete(/*...*/);
    
    // Place your error handler after all other middlewares
    app.use((error, req, res, next) => {
      /* ... */
    });
    
    사용자 정의 오류 처리 프로그램을 만들면 Express가 기본 오류 처리 프로그램을 사용하지 않습니다.오류를 처리하려면 요청 노드의 전단과 통신해야 합니다.이것은 당신이 필요로 하는 것을 의미한다.
  • 유효한 HTTP 상태 코드
  • 로 보내기
  • 유효한 응답 보내기
  • 유효한 HTTP 상태 코드는 어떻게 되는지에 따라 달라집니다.다음은 준비해야 할 일반적인 오류 목록입니다.

  • 400 오류 요청 오류:
  • 사용자가 한 필드를 포함하지 못할 경우(예를 들어 지불표에 신용카드 정보가 없음)
  • 사용자가 잘못된 정보를 입력할 때도 사용됩니다(예: 암호 필드와 암호 확인 필드에 다른 암호를 입력).

  • 401 권한이 부여되지 않은 오류: 사용자가 잘못된 로그인 정보(예를 들어 사용자 이름, 이메일 또는 비밀번호)를 입력할 때 사용합니다.

  • 403 금지된 오류: 사용자가 단점에 접근할 수 없을 때 사용합니다.

  • 404 오류를 찾을 수 없음: 단점을 찾을 수 없을 때 사용합니다.

  • 500 내부 서버 오류: 프런트엔드에서 보낸 요청은 정확했지만 백엔드에서 오류가 발생했습니다.
  • 올바른 HTTP 상태 코드가 확인되면 상태를 res.status로 설정해야 합니다.
    app.use((error, req, res, next) => {
      // Bad request error
      res.status(400);
      res.json(/* ... */);
    });
    
    HTTP 상태 코드가 오류 메시지와 일치해야 합니다.상태 코드를 오류 메시지와 일치시키려면 오류 메시지와 함께 보내야 합니다.
    가장 간단한 방법은 http-errors 패키지를 사용하는 것이다.세 가지 컨텐트를 오류로 보낼 수 있습니다.
  • 상태 코드
  • 오류 메시지 동반
  • 당신이 보내고 싶은 모든 재산.이것은 선택할 수 있는 것이다.
  • 설치http-errors:
    npm install http-errors --save
    
    사용http-errors:
    const createError = require("http-errors");
    
    // Creating an error
    throw createError(status, message, properties);
    
    우리가 함께 예를 하나 보고 그것을 더욱 분명하게 하자.사용자의 전자 우편 주소를 통해 사용자를 찾으려고 시도할 경우를 가정하십시오.사용자를 찾을 수 없습니다."사용자를 찾을 수 없습니다"라고 쓰여 있는 오류를 던지고 싶습니다.
    오류를 생성할 때 다음을 수행합니다.
  • 사용자가 잘못된 정보를 작성했기 때문에 400 오류 요청 오류를 보냅니다.첫 번째 매개변수로 보낼 수 있습니다.
  • 사용자를 찾을 수 없음을 표시하는 메시지를 보냅니다.두 번째 매개변수로 보낼 수 있습니다.
  • app.put(
      "/testing",
      asyncHandler(async (req, res) => {
        const { email } = req.body;
        const user = await User.findOne({ email });
    
        // Throws error if user not found
        if (!user) throw createError(400, `User '${email}' not found`);
      })
    );
    
    error.status 상태 코드를 가져오고 error.message 오류 메시지를 가져올 수 있습니다.
    // Logging the error
    app.use((error, req, res, next) => {
      console.log("Error status: ", error.status);
      console.log("Message: ", error.message);
    });
    

    그런 다음 오류 상태를 res.status로 설정합니다.res.json로 메시지를 보내세요.
    app.use((error, req, res, next) => {
      // Sets HTTP status code
      res.status(error.status);
    
      // Sends response
      res.json({ message: error.message });
    });
    
    개인적으로, 나는 디버깅을 쉽게 하기 위해 상태, 메시지, 창고 추적을 보내는 것을 좋아한다.
    app.use((error, req, res, next) => {
      // Sets HTTP status code
      res.status(error.status);
    
      // Sends response
      res.json({
        status: error.status,
        message: error.message,
        stack: error.stack
      });
    });
    

    대기 상태 코드


    오류가 createError에서 발생하지 않으면 상태 속성이 없습니다.
    여기에 예가 하나 있다.fs.readFile 로 파일을 읽으려고 했지만 존재하지 않습니다.
    const fs = require('fs')
    const util = require('util')
    
    // Converts readFile from callbacks to Async/await.
    // Find out how to do this here: https://zellwk.comhttps://zellwk.com/blog/callbacks-to-promises
    const readFilePromise = util.promisify(fs.readFile)
    
    app.get('/testing', asyncHandler(async (req, res, next) => {
      const data = await readFilePromise('some-file')
    })
    
    이 오류는 status 속성을 포함하지 않습니다.
    app.use((error, req, res, next) => {
      console.log("Error status: ", error.status);
      console.log("Message: ", error.message);
    });
    

    이 경우 내부 서버 오류 500개를 기본으로 설정할 수 있습니다.
    app.use((error, req, res, next) => {
      res.status(error.status || 500);
      res.json({
        status: error.status,
        message: error.message,
        stack: error.stack
      });
    });
    

    잘못된 상태 코드 변경


    사용자의 입력에서 파일을 검색하고 싶다고 가정하십시오.파일이 존재하지 않으면 서버 오류가 아니기 때문에 400 오류 요청 오류를 던져야 합니다.
    이 예에서 원시 오류를 포착하려면 try/catch를 사용하십시오.그런 다음 createError를 사용하여 오류를 다시 생성합니다.
    app.get('/testing', asyncHandler(async (req, res, next) => {
      try {
        const { file } = req.body
        const contents = await readFilePromise(path.join(__dirname, file))
      } catch (error) {
        throw createError(400, `File ${file} does not exist`)
      }
    })
    

    404 오류 처리


    요청이 모든 중간부품과 루트를 통과하면 단점을 찾을 수 없습니다.
    찾을 수 없는 오류를 처리하려면 루트와 오류 처리 프로그램 사이에 중간부품을 삽입해야 합니다.여기에서 createError 를 사용하여 오류를 만듭니다.
    // Middlewares...
    // Routes...
    
    app.use((req, res, next) => {
      next(createError(404));
    });
    
    // Error handler...
    

    클라이언트에 보낸 후 헤더를 설정할 수 없음 정보


    "서버에 전송한 후 헤더를 설정할 수 없습니다."라는 오류가 발생하면 당황하지 마십시오.

    이 오류가 발생한 이유는 코드가 같은 처리 프로그램에서 응답 헤더를 설정하는 방법을 여러 번 실행했기 때문입니다.응답 제목을 설정하는 방법은 다음과 같습니다.
  • res.send
  • res.json
  • res.render
  • res.sendFile
  • res.sendStatus
  • res.end
  • res.redirect
  • 예를 들어 같은 응답 프로세서res.renderres.json를 실행하면'발송 후 헤더를 설정할 수 없음'오류가 발생합니다.
    app.get("/testing", (req, res) => {
      res.render("new-page");
      res.json({ message: "¯_(ツ)_/¯" });
    });
    
    따라서 이 오류가 발생하면 응답 처리 프로그램을 자세히 검사해서 상기 방법을 두 번 실행하지 않도록 하십시오.

    스트리밍 미디어


    응답 흐름을 전방으로 전송하는 중 오류가 발생하면 같은 제목을 설정할 수 없습니다 오류가 발생합니다.
    이 경우 Express 공지는 기본 Express Processor에 오류 처리를 위임해야 합니다.오류가 발생하여 연결을 닫습니다.
    app.use((error, req, res, next) => {
      // Do this only if you're streaming a response
      if (res.headersSent) {
        return next(error);
      }
    
      // Rest of the error handlers
    });
    
    나 지금 이것밖에 몰라!:)
    읽어주셔서 감사합니다.본문은 최초로 my blog에 발표되었다.만약 당신이 더 많은 글을 가지고 더 좋은 전단 개발자가 되는 것을 돕고 싶다면, 나의 시사 통신에 등록해 주십시오.

    좋은 웹페이지 즐겨찾기