현재 백엔드에 TypeScript가있는 MEAN 프로젝트에서 작업 중입니다. 모든 것이 잘 작동합니다.Node/Express 및 MongoDB : Model.create()를 사용한 Async/Await
TodoSchema.static('createTodo', async (newTodo: ITodo) => {
return await Todo.create(newTodo)
.then((result: ITodo) => result)
.catch((error: MongoError) => error);
});
위의 코드 블록이 잘 작동하지만 내가 생각 async/await
에 대한 중복 조금 보이는 그러나, 나는 다음과 같은 코드 블록을 궁금 해서요. 아래는 위의 함수를 호출하는 코드 블록은 다음과 같습니다
const result = await Todo.createTodo(newTodo);
if (result instanceof MongoError) TodoController.resolveErrorResponse(res, result.message, 500, result);
if ((typeof(result)) === 'undefined' && !result) TodoController.resolveErrorResponse(res, 'Error saving Todo', res.statusCode);
모든 것이 제대로 여기 반환합니다. 나는 그것이 약간 중복의 느낌을 말했다 그러나, 나는 then/catch
블록 꺼내서 :
TodoSchema.static('createTodo', async (newTodo: ITodo) => {
return await Todo.create(newTodo);
});
을하고이 오류가있어 (내가 여기 끔찍하게 잘못 될 수도 있습니다) 내 이해에
(node:1306) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: E11000 duplicate key error index: jaanartc.todos.$slug_1 dup key: { : "test-title" }
을 return await Todo.create(newTodo)
은 create()
의 결과를 반환해야합니다. 따라서 instanceof MongoError
을 확인하면 정상이어야한다고 생각합니다.
저를 계몽하십시오. 고맙습니다./비동기를 채택
참고로,'return await someFunc()'의 이유는 없습니다. 아무것도 추가하지 않습니다. 'async' 함수는 이미 약속을 반환하고 값을 사용하기 위해 호출자는'await' 또는'.then()'를 사용해야합니다. 그래서, 그냥'돌아 오는 Todo.create (...). then (...)'. 'await'는 리턴 값이 아닌 사용 된 함수 내에서만 작동합니다. 'async' 함수는 여전히 비동기이며, 여러분이 원하는 값으로 해결 된 약속을 반환합니다. 'return await someFunc()'을하면 마술처럼 async 함수가 직접 값을 반환 할 수 있습니다. 그것은 여전히 약속을 반환합니다. – jfriend00
정확합니다. 명확히 해 주셔서 감사합니다. –