繁体   English   中英

使用Promise或Async / Await的猫鼬的区别?

Difference on Mongoose using Promise or Async/Await?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

使用ExpressJs(作为Node.js的Web框架)和Mongoose(用于对MongoDB建模)来创建Web服务。 我有一个关于最好的方法来处理猫鼬方法(保存,查找,findByIdAndDelete等)中的返回对象的问题。

正如猫鼬的文档所述,Model.prototype.save()将返回«Promise,undefined»(如果未与回调一起使用,则返回undefined),否则将与Promise一起使用。 有关更多信息: https : //mongoosejs.com/docs/api.html#model_Model-save

所以我想知道我们应该使用哪一种,或者哪种情况比另一种更好?

作为使用ES7异步/等待的示例:

const mongoose = require('mongoose');
const Person = mongoose.model('person');

module.exports.savePerson = async (req,res) => {
  await new Person( {...req.body} )
    .save( (err, doc)=> {
      err ? res.status(400).json(err) : res.send(doc);
    });
}

作为使用ES6 Promise的示例:

const mongoose = require('mongoose');
const Person = mongoose.model('person');

module.exports.savePerson = (req,res) => {
  const person = new Person( {...req.body} )

  person.save()
    .then(person => {
      res.send(person);
    })
    .catch(err => {
      res.status(400).json(err)
    });
}
1 个回复

如果要await ,请不要使用回调:

 module.exports.savePerson = async (req,res) => {
   try {
     const doc = await new Person( {...req.body} ).save();
     res.send(doc);
   } catch(error) {
     res.status(400).json(err);
   }
};

所以我想知道我们应该使用[.thens]还是[awaits]?

那是基于观点的,但是在我眼中, await方式更具可读性,尤其是当您必须等待多种情况时。


安全建议:未经验证直接将客户端数据传递到数据库有点危险。

6 如何使用 async/await 使用 Jest 测试猫鼬模型验证错误?

我正在尝试使用 Jest 测试一个简单的模型验证。 模型如下: 然后,在我的测试文件中,我有以下设置: 现在,当我尝试使用回调运行测试时,我得到了想要的结果(err 为null ): 但是,当我重构该测试以使用 async/await 时,它每次都会通过,即使我将invalidUser更 ...

7 使用 async/await 与使用 Promise 有何不同?

最近我开始使用 (Async & Await)。 在此之前,我使用 Promise 使我的流程异步。 喜欢: 现在我正在实现这个: 在这两种情况下,代码块方法一个接一个地执行,如果有错误,最终会抛出一个错误并被catch块catch 。 我的问题是,这只是语法的不同吗? 请解释或建议 ...

9 JavaScript:在 Promise 中使用 Async/Await

在学习异步 JavaScript 概念的过程中,我对它们可以链接的情况背后的想法感到困惑。 例如,考虑以下情况:Webhook 调用云函数,并且根据要求设置了云函数响应 Webhook 的时间间隔。 在云函数中称为从数据库中获取一些数据的操作,该操作可以是短期或长期运行的任务。 出于这个原因,我们可 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM