Express에서 비동기식/대기

19535 단어 expressnodejavascript
Express 요청 프로세서에 비동기식 코드가 많이 작성되어 있음을 알고 계십니까?데이터베이스, 파일 시스템, 기타 API와 통신해야 하기 때문에 정상입니다.
이렇게 많은 비동기 코드가 있을 때, Async/await를 사용하면 도움이 됩니다.그것은 당신의 코드를 더욱 쉽게 이해하게 합니다.
오늘은 Express 요청 처리 프로그램에서 async/await를 사용하는 방법을 공유하고 싶습니다.
주의: 계속하기 전에 Async/await가 무엇인지 알아야 합니다.모르는 경우 this article 자세한 내용을 참조하십시오.

요청 프로세서와 함께 비동기식 / 대기


Async/await를 사용하려면 요청 처리 프로그램을 정의할 때 async 키워드를 사용해야 합니다.(주의: 이 요청 처리 프로그램은 컨트롤러라고 합니다. 요청 처리 프로그램이 더 뚜렷하기 때문에 요청 처리 프로그램이라고 부르는 것을 더 좋아합니다.
app.post("/testing", async (req, res) => {
  // Do something here
});
일단 async 키워드가 생기면 await 바로 코드에 입력할 수 있습니다.
app.post("/testing", async (req, res) => {
  const user = await User.findOne({ email: req.body.email });
});

비동기식 오류 처리


POST 요청을 통해 사용자를 생성하려는 경우사용자를 만들려면 firstNameemail 주소를 입력해야 합니다.당신의 족제비 모드는 다음과 같습니다.
const userSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true
  },
  firstName: {
    type: String,
    required: true
  }
});
이것은 귀하의 요청 처리 프로그램입니다.
app.post("/signup", async (req, res) => {
  const { email, firstName } = req.body;
  const user = new User({ email, firstName });
  const ret = await user.save();
  res.json(ret);
});
현재, 서버에 전자 우편 주소가 없는 요청을 보냈다고 가정하십시오.
fetch('/signup', {
  method: 'post'
  headers: { 'Content-Type': 'application/json' }
  body: JSON.stringify({
    firstName: 'Zell'
  })
}
이 요청은 오류를 초래했습니다.불행히도 Express에서는 이 오류를 처리할 수 없습니다.다음 로그를 받게 됩니다.

비동기 함수의 오류를 처리하려면 먼저 오류를 포착해야 한다.try/catch를 사용하여 작업을 완료할 수 있습니다.
app.post("/signup", async (req, res) => {
  try {
    const { email, firstName } = req.body;
    const user = new User({ email, firstName });
    const ret = await user.save();
    res.json(ret);
  } catch (error) {
    console.log(error);
  }
});

다음으로 next 매개 변수를 사용하여 Express 오류 처리 프로그램에 오류를 전달합니다.
app.post("/signup", async (req, res, next) => {
  try {
    const { email, firstName } = req.body;
    const user = new User({ email, firstName });
    const ret = await user.save();
    res.json(ret);
  } catch (error) {
    // Passes errors into the error handler
    return next(error);
  }
});
사용자 정의 오류 처리기를 작성하지 않은 경우 Express는 기본 오류 처리기를 사용하여 오류를 처리합니다.(사용자 정의 오류 처리 프로그램을 작성하는 것을 권장하지만, 더 많은 정보를 얻을 수 있습니다 here.
Express의 기본 오류 처리기는 다음과 같습니다.
  • HTTP 상태를 500으로 설정
  • 텍스트 응답을 요청자에게 보내기
  • 콘솔에서 텍스트 응답 기록
  • Postman을 사용하여 서버에 요청을 보냅니다.이것은 서버가 되돌아오는 텍스트 응답입니다.
    이 그림의 500 HTTP 상태 로그를 참조하십시오.이것은 Express의 기본 프로세서가 HTTP 상태를 500으로 변경한다는 것을 알려 줍니다.일지는 모건에서 왔다.E는 모건 here에 대해 상세하게 이야기했다.

    두 개 이상의 비동기식 오류 처리


    두 개의 await 문장을 처리해야 할 경우 다음 코드를 작성할 수 있습니다.
    app.post("/signup", async (req, res, next) => {
      try {
        await firstThing();
      } catch (error) {
        return next(error);
      }
    
      try {
        await secondThing();
      } catch (error) {
        return next(error);
      }
    });
    
    이것은 불필요한 것이다.firstThing 오류가 발생하면 오류 처리 프로그램에 요청이 즉시 전송됩니다.secondThing에 대한 호출을 터치하지 않습니다.secondThing 오류가 발생하면 firstThing 오류가 발생하지 않습니다.
    이것은 오류가 오류 처리 프로그램에 전송된다는 것을 의미한다.이것은 또한 우리가 모든 await 문장을 하나의 try/catch 문장에 봉인할 수 있다는 것을 의미한다.
    app.post("/signup", async (req, res, next) => {
      try {
        await firstThing();
        await secondThing();
      } catch (error) {
        return next(error);
      }
    });
    

    정리하다


    요청 처리 프로그램마다 try/catch 문장이 엉망입니다.그것들은 요청 처리 프로그램을 필수보다 더 복잡하게 만든다.
    간단한 방법은 try/catch 을 약속으로 바꾸는 것이다.이 느낌은 더욱 우호적이다.
    app.post('/signup', async(req, res, next) => {
      function runAsync () {
        await firstThing()
        await secondThing()
      }
    
      runAsync()
        .catch(next)
    })
    
    그러나 모든 Express 프로세서 runAsync 를 작성하는 것은 매우 번거로운 일이다.우리는 그것을 포장기 함수로 추상할 수 있다.우리는 이 포장기 함수를 모든 요청 처리 프로그램에 추가할 수 있다
    function runAsyncWrapper (callback) {
      return function (req, res, next) {
        callback(req, res, next)
          .catch(next)
      }
    }
    
    app.post('/signup', runAsyncWrapper(async(req, res) => {
        await firstThing()
        await secondThing()
    })
    

    빠른 비동기식 프로세서


    express 프로그램을 작성할 때마다 runAsyncWrapper 코드를 작성할 필요가 없습니다.Alexei Bazhenovexpress-async-handler이라는 가방을 만들었습니다. 이 가방은 조금 더 건장한 방식으로 이 작업을 완성합니다.next가 항상 마지막 매개변수임을 확인합니다.express-async-handler를 사용하려면 먼저 설치해야 합니다.
    npm install express-async-handler --save
    
    응용 프로그램에서 사용:
    const asyncHandler = require('express-async-handler')
    
    app.post('/signup', asyncHandler(async(req, res) => {
        await firstThing()
        await secondThing()
    })
    
    나는 작문을 좋아하지 않는다asyncHandler.그것은 상당히 길다.명백한 해결 방안은 asyncHandlerash 로 줄이는 것이다.
    만약 당신이 더 좋아한다면, 당신은 사용을 고려할 수 있습니다 @awaitjs/express.이것은 getAsyncpostAsync 등의 방법을 추가하여 표시하기 때문에 사용할 필요가 없습니다 express-async-handler.
    읽어주셔서 감사합니다.본고는 최초로 my blog에 발표되었다.더 좋은 전단 개발자가 될 수 있도록 더 많은 글을 원하신다면 제 뉴스 원고를 등록해 주십시오.

    좋은 웹페이지 즐겨찾기