2017-12-27 37 views
0

私は現在、バックエンドにTypeScriptを持つMEANプロジェクトに取り組んでいます。すべてうまくいきます。Node/ExpressとMongoDB:Model.create()で非同期/待機しています

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

FYI、 'return await someFunc()'の理由は決してありません。それは何も追加しません。 'async'関数はすでに約束を返し、その値を使用するために、呼び出し側は' await'または '.then()'を使用する必要があります。だから、ちょうど 'Todo.create(...)、then(...)を返します。 'await'は、使用されている関数の内部でのみ動作し、戻り値では動作しません。 'async'関数はまだ非同期であり、解決された値があなたが望むものである約束を返します。 'return await someFunc()'を実行すると、魔法のように 'async'関数が値を直接返すことができます。それはまだ約束を返す。 – jfriend00

+0

あなたは正しいです。明確化のためにありがとう。 –

答えて

0

非同期/ワークフローを待つの採用で、私は2つの選択肢があると思う:それは頭痛の種になるので、私は、第二のアプローチとなるだろう

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、おそらくあなたは完全に型付けされたmongooseスキーマとモデルのワークフローに興味があります。https://gist.github.com/rasdaniil/a63fc9ae83819f4587bb498ac10a689f –

+0

あなたの答えをありがとう。私は自分のコードを調整しました。あなたはhttps://github.com/nartc/jaanartcを見てください。 –

+1

きれいなコード、私はそこにPRを送ってきました。 –

関連する問題