2017-12-27 35 views
0

현재 백엔드에 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을 확인하면 정상이어야한다고 생각합니다.

저를 계몽하십시오. 고맙습니다./비동기를 채택

+1

참고로,'return await someFunc()'의 이유는 없습니다. 아무것도 추가하지 않습니다. 'async' 함수는 이미 약속을 반환하고 값을 사용하기 위해 호출자는'await' 또는'.then()'를 사용해야합니다. 그래서, 그냥'돌아 오는 Todo.create (...). then (...)'. 'await'는 리턴 값이 아닌 사용 된 함수 내에서만 작동합니다. 'async' 함수는 여전히 비동기이며, 여러분이 원하는 값으로 해결 된 약속을 반환합니다. 'return await someFunc()'을하면 마술처럼 async 함수가 직접 값을 반환 할 수 있습니다. 그것은 여전히 ​​약속을 반환합니다. – jfriend00

+0

정확합니다. 명확히 해 주셔서 감사합니다. –

답변

0

내가 두 가지 옵션이 있다고 생각, 워크 플로우를 기다리고 :

TodoSchema.static('createTodo', async (newTodo: ITodo) => { 
    return await Todo.create(newTodo); 
}); 

// later on in code 
try { const item = await TodoModel.createTodo({...}); } 
catch (e) { // do something } 

또는

TodoSchema.static('createTodo', async (newTodo: ITodo): Promise<TodoInstance | null> => { 
    try { return await Todo.create(newTodo); } 
    catch (e) { return null; } 
}); 

// later on in code 
const item = await TodoModel.createTodo({...}); 

if (!item) { 
    // something went wrong 
} 

item.remove() // this is safe now 
은 두통, 그렇지 않으면

것 때문에 나는, 두 번째 방법으로 갈 것

+0

Btw, 아마 내 완전 입력 된 몽구스 스키마 및 모델 워크 플로우에 관심이있을 것입니다. https://gist.github.com/rasdaniil/a63fc9ae83819f4587bb498ac10a689f –

+0

답장을 보내 주셔서 감사합니다. 내 코드를 조정 했으니, https://github.com/nartc/jaanartc에서 살펴볼 수있다. –

+1

깔끔한 코드, 나는 그곳에 홍보를 보냈다. –