在 Mongoose 路由中使用 Promise

2024-03-28

我了解 JavaScript 中的 Promise,或者至少我认为我了解(如果我错了,请纠正我)。

创建一个承诺:

var promise = new Promise(function(resolve, reject){
  // do something async here

  if(itWorked){

    resolve();

  }else {

    reject();
  }

});

使用承诺:

promise.then(function(result){

},function(err){

});

我有一个基于 MEAN Stack 的应用程序,我的一些猫鼬路线正在成为回调地狱。我想摆脱猫鼬路由中的回调并使用 Promises 处理它们。但我似乎不知道到底该怎么做。

例如:

app.get('/users', function(req, res){

  User.findOne(_id, function(err, user){
      if(err)
         console.log(err)
      else if(user){

         Receipt.findOne(user.bookName, function(err, book){
           if(err)
            console.log(err)

           else if(book){
             // again do something here
          }  
       })
     }
   })
});

在上面的示例中,您可以看到代码变得越来越难以阅读和维护。我如何在这里使用 Promise 来改进我的代码?


好的,首先你在使用mongoose right?

User是你的猫鼬模型,它响应诸如findOne(query), findOneAndUpdate(query, update, opts) etc..

调用其中任何一个方法后,调用该方法exec()它返回一个查询。

查询并不完全是一个 Promise,您需要指定 Mongo 将使用哪些 Promise。在这里我建议使用原生的,因此,在您的项目中添加这一行:

 const mongoose = require('mongoose')
 mongoose.Promise = Promise

现在,这条指令返回给你一个 Promise,很好!

User.findOne(q).exec()

您现在可以使用您的逻辑创建 Promise 链,例如:

 return User
     .findOne(_id)
     .exec()
     .then((user) => {
       return Receipt
         .findOne({ bookName: user.bookName })
         .exec()
       })
     .then((receipt) => {
            // example
            return res.status(200).json(receipt)
         }))
     })

提示:我建议创建辅助方法以使代码更加简洁:

/** @return {Promise} */
function findUser(id) {
  return User.findOne(id).exec()
}

/** @return {Promise} */
function findReceipt(bookName) {
  return Receipt.findOne({ bookName }).exec()
}

// example
function f(req, res) {
  const userId = req.get('id')

  return findUser(userId)
    .then((user) => findReceipt(user.bookName))
    .then((receipt) => res.status(200).json(receipt))
    .catch((err) => res.status(500).json(null))
}

// register your handler
app.get('/book', f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Mongoose 路由中使用 Promise 的相关文章

  • Iphone 上的 Javascript 日期解析

    我正在开发一个针对移动设备的离线 Javascript 网站 iPhone 就是这样的一种移动设备 我正在尝试从 REST API JSON 对象的成员 解析日期 我在用着 Date parse 2010 03 15 10 30 00 这适
  • Typescript 编译错误:类型“typeof e”上不存在属性“bodyParser”

    我想在我的节点 express 环境中使用打字稿 托管在 Cloud 9 ide 中 我在尝试让编译器编译 app ts 时遇到问题 它出现了几个错误 其中属性 bodyParser 在类型 typeof e 上不存在就是其中之一 我在应用
  • contenteditable,在文本末尾设置插入符号(跨浏览器)

    输出在Chrome div style border 1px solid 000 width 500px height 40px hey div what s up div div div div
  • 如何从 JavaScript 触发 ASP.NET Core 客户端验证

    有没有办法从 JavaScript 触发 ASP NET Core 客户端验证 我有一个 Razor Pages 页面 其中包含
  • Firefox(仅限)动态表单操作不起作用

    控制台为操作属性返回空白 我已经移动了 file upload attr action io cfm action updateitemfile item id agenda modal attr data defaultitemid 周围
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • ajax 调用成功后点击链接 href

    我有一个正常的链接 a href http www google com class continue Continue a 我已将点击绑定到一个事件来发布 ajax 请求 如下所示 continue click function ajax
  • JSLint 错误:意外的“这个”

    无法理解为什么 JSLint 对我的使用感到惊讶this在下面的代码中 function testConstr x use strict this joker Whyyy sooo seriousss this x x 对于这两个属性分配
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 如何在特定天数限制后从温斯顿日志中删除文件?

    我正在使用winston将文件记录到按预期工作的服务器中 现在我想设置天数限制 假设3天后我想删除3天前记录的文件 是否可以使用winston轮换来实现 main js winston add winston transports File
  • 将 DIV 转换为单击并拖动视口

    有人知道一种不显眼的 基于原型或无框架的方法将具有大内容 例如地图 的 DIV 转换为具有固定尺寸的可点击和可拖动的 地图 容器 非常像 Google 地图 我想在大型输入表单中显示 HTML 块 这些块可能会超出可用空间 每个块可以有大约
  • 如何在 AWS Amplify 上运行 React/Redux 应用程序的代理

    我最近实施了Proxy 在 Express js 中 对于我的反应应用程序发出请求时隐藏 API URL 当我在本地主机上运行代理和应用程序时 它工作得非常好 现在我已准备好将我的应用程序部署到AWS 放大 我对如何让我的代理在那里运行有点
  • 使用 Google 地图 API 进行反向地理编码

    我正在研究 JavaScript Google Map API 版本 3 更准确地说 正在研究反向地理定位 在 的帮助下官方文档 http code google com intl fr apis maps documentation ge
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • 防止 Bootstrap IE 下拉列表在滚动条单击时关闭

    在 IE 中 单击下拉菜单滚动条时 下拉菜单将关闭 当您使用鼠标滚轮滚动它时 效果很好 这是代码层链接 https www codeply com go Uh8qadr3q2 https www codeply com go Uh8qadr
  • 响应覆盖 div 下的链接

    场景是这样的 我已经构建了一个顶部导航原型 它需要在其顶部有一个覆盖 透明 PNG 图像 目前它覆盖了大约 1 3 的链接 请看下面 有什么方法可以让前 1 3 的链接做出响应 即使有一个 div div 部分覆盖它们 覆盖层不会包含任何可
  • 如何使用 Javascript 从 Chrome iOS 下载 blob 文件?

    如何使用 Javascript 从 Chrome iOS 下载 blob 文件 我正在从 iOS 下载文件 pdf excel txt png iOS 没有文件系统 这对下载来说是一个问题 我创建了一个代码 根据操作系统和导航器 如果需要
  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看
  • 在javascript中我们如何识别一个对象是Hash还是Array?

    我的 JSON 调用的输出可以是数组或哈希 我如何区分这两者 现代浏览器支持Array isArray obj method See MDN https developer mozilla org en US docs Web JavaSc

随机推荐

  • 传递零大小的数组,保存分配?

    在此代码示例中 第 114 页基础扎实的 Java 开发人员 https rads stackoverflow com amzn click com 1617290068 最后一行 Update updates lu toArray new
  • 当子组件发生变化时,父组件是否会重新渲染?

    我有一个父组件 如下所示 const Parent gt return
  • Code Golf:数字的质因数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • CruiseControl.Net 仪表板 + Apache

    我正在尝试让 cc net 仪表板在也有 apache 的构建机器上运行 我尝试按照描述安装 mod aspdotnethere http weblogs asp net israelio archive 2005 09 11 424852
  • 辅助服务无法读取所有屏幕内容

    Issue 没有在 Android 馅饼中获取屏幕上的所有文本 检查直到牛轧糖代码工作正常 Device 小米 MiA1 Android One 版本 9 0 XML 设置
  • 禁用右键单击表单字段级别

    我需要通用功能 可以禁用右键单击表单字段 document oncontextmenu function e var el window event srcElement e target var tp el tagName if tp t
  • 在 test_package 中使用过滤器参数来跳过测试

    我想在期间运行我的包单元测试R CMD check 但跳过需要互联网连接的测试 按照惯例 所有需要互联网的单元测试都有这个词network在他们的文件名中 因此我的run all R包含 library testthat test pack
  • 未知自定义结构上的结构化绑定

    简洁版本 我希望能够将结构转换为元组 至少是类型 在下面的代码中 转换为元组函数不起作用 因为可变参数不能在结构化绑定中使用 据我所知 关键行是 自动 值 值 struct Vec3 float x float y float z temp
  • PySpark:添加一个新列,其中包含从列创建的元组

    这里我创建了一个数据框 如下所示 df spark createDataFrame a 5 R X b 7 G S c 8 G S Id V1 V2 V3 看起来像 Id V1 V2 V3 a 5 R X b 7 G S c 8 G S 我
  • 追加克隆或动态创建 DOM - 哪个更好?

    我希望从 ajax 调用返回的数组中生成以下列表 ul li li ul
  • Asciidoc 中文字内的替换

    似乎没有办法在 Asciidoc 的文字文本中解析变量 属性 替换 否则我会遗漏一些东西 我希望能够设置一个变量 然后在代码块或文字字符串中调用它 如下所示 version 1 0 1 code tar xzvf mysoftware ve
  • the_title 函数返回字符串而不是 WordPress 中的 echo

    在Wordpress中 如何更改the title 回显标题以返回字符串的函数 title反而 我正在尝试 the title gt title the title title 两种方式 Use get the title https de
  • 通过 Tweepy 去除推文中的换行符

    我正在寻找从 Twitter API 提取数据并创建一个管道分隔的文件 我可以对其进行进一步处理 我的代码目前如下所示 auth tweepy OAuthHandler CONSUMER KEY CONSUMER SECRET auth s
  • PHP mkdir 问题!

    我尝试创建一些像这样的目录 mkdir photos cat sku 0777 true 它使用 0777 权限创建第一个目录 但在创建第二个目录时使用 000 作为其权限 因此无法创建第三个目录 请问有解决方法吗 谢谢 理查德 这解决了这
  • 通过引用传递比较器函数 (C++11)

    我正在尝试加快我的代码速度 下面是最小的 可重现的示例 并且我被告知通过引用传递对于我的比较器函数来说是一种更有效的方法 那是我第一次听说这个短语 所以我查了一下 找到了一些带有示例的网站 但我不明白何时以及如何使用它 在这种情况下我将如何
  • 列出与rabbitmq java客户端API交换的绑定

    我似乎在文档中找不到任何信息 所以我想知道是否可以通过某种方式使用 java RabbitMQ API 获取与交换相关的所有绑定 我在查询 api bindings 时正在寻找类似 http api 结果的内容 api definition
  • Cocoa 应用程序已完成启动

    有什么方法可以判断 Cocoa 应用程序 例如 Safari 是否已完成启动并能够响应 我知道在实际代码中使用委托很容易 但这对于我正在做的事情来说是不可能的 Thanks 查看 NSWorkspace 和 NSWorkspaceDidLa
  • PHP中的DES/ECB/PKCS5Padding解密

    我需要用 PHP 或 Javascript 解密一些服务调用 我花了一整天的时间试图完成这个任务 但我无法正确解密它 作为参考 服务提供商给我发送了以下 Java 解密示例代码 DESKeySpec dks new DESKeySpec k
  • 使用 Spring Boot 时 java.lang.IllegalStateException LifecycleProcessor 和 ApplicationEventMulticaster 未初始化

    我创建了一个 Spring Boot 包装类 如下所示 package package for import org springframework boot SpringApplication import org springframe
  • 在 Mongoose 路由中使用 Promise

    我了解 JavaScript 中的 Promise 或者至少我认为我了解 如果我错了 请纠正我 创建一个承诺 var promise new Promise function resolve reject do something asyn