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

Posted

技术标签:

【中文标题】Node/Express 和 MongoDB:Async/Await 与 Model.create()【英文标题】:Node/Express and MongoDB: Async/Await with Model.create() 【发布时间】:2018-06-07 17:03:39 【问题描述】:

我目前正在开发一个 MEAN 项目,后端使用 TypeScript。一切正常。但是,我想知道以下代码块:

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 函数已经返回了一个 promise 并且要使用该值,调用者必须自己使用 await.then()。所以,只需return Todo.create(...).then(...)await 仅适用于它所使用的函数内部,不适用于返回值。 async 函数仍然是异步的,并返回一个 promise,它的解析值是你想要的。执行return await someFunc() 确实神奇地允许async 函数直接返回值。它仍然返回一个承诺。 你是对的。感谢您的澄清。 【参考方案1】:

在采用 async/await 工作流程时,我认为有两种选择:

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

我会选择第二种方法,否则会很头疼

【讨论】:

顺便说一句,也许你会对我的全类型猫鼬模式和模型工作流感兴趣gist.github.com/rasdaniil/a63fc9ae83819f4587bb498ac10a689f 感谢您的回答。我已经调整了我的代码,你可以看看github.com/nartc/jaanartc 代码很干净,我已经发了一个公关,也许你会觉得有用

以上是关于Node/Express 和 MongoDB:Async/Await 与 Model.create()的主要内容,如果未能解决你的问题,请参考以下文章

使用node+express+mongodb实现用户注册登录和验证功能

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

MongoDB/Express/Node 文件上传错误

Node、Express、MongoDB:使用对象数组创建模式?

将图像文件从 React 前端上传到 Node/Express/Mongoose/MongoDB 后端(不工作)

node+express+mongodb搭建博客