Express에서 비동기식/대기
19535 단어 expressnodejavascript
이렇게 많은 비동기 코드가 있을 때, 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 요청을 통해 사용자를 생성하려는 경우사용자를 만들려면
firstName
및 email
주소를 입력해야 합니다.당신의 족제비 모드는 다음과 같습니다.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의 기본 오류 처리기는 다음과 같습니다.
이 그림의 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 Bazhenov은express-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
.그것은 상당히 길다.명백한 해결 방안은 asyncHandler
을 ash
로 줄이는 것이다.만약 당신이 더 좋아한다면, 당신은 사용을 고려할 수 있습니다 @awaitjs/express.이것은
getAsync
및 postAsync
등의 방법을 추가하여 표시하기 때문에 사용할 필요가 없습니다 express-async-handler
.읽어주셔서 감사합니다.본고는 최초로 my blog에 발표되었다.더 좋은 전단 개발자가 될 수 있도록 더 많은 글을 원하신다면 제 뉴스 원고를 등록해 주십시오.
Reference
이 문제에 관하여(Express에서 비동기식/대기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zellwk/using-async-await-in-express-3p77텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)