Node / Express和MongoDB:Async / Await with Model.create()

时间:2017-12-27 02:25:34

标签: typescript express asynchronous mongoose async-await

我目前正在后端开发一个带有TypeScript的MEAN项目。一切都很好。但是,我想知道以下代码块:

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 个答案:

答案 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

我会采用第二种方法,因为否则会很头疼