私は現在、バックエンドに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
をチェックすれば、私はうまくいくはずだと思う。
私に教えてください。ありがとうございました。
FYI、 'return await someFunc()'の理由は決してありません。それは何も追加しません。 'async'関数はすでに約束を返し、その値を使用するために、呼び出し側は' await'または '.then()'を使用する必要があります。だから、ちょうど 'Todo.create(...)、then(...)を返します。 'await'は、使用されている関数の内部でのみ動作し、戻り値では動作しません。 'async'関数はまだ非同期であり、解決された値があなたが望むものである約束を返します。 'return await someFunc()'を実行すると、魔法のように 'async'関数が値を直接返すことができます。それはまだ約束を返す。 – jfriend00
あなたは正しいです。明確化のためにありがとう。 –