Node.js 与 mongoskin 的承诺

2023-12-27

我试图在进行 mongodb 查询时避免使用回调。我正在使用 mongoskin 来拨打电话,如下所示:

req.db.collection('users').find().toArray(function (err, doc) {
  res.json(doc);
});

在许多情况下,我需要进行多个查询,因此我想使用 Node.js Promise 库,但我不确定如何将这些函数包装为 Promise。我看到的大多数例子对于类似的事情来说都是微不足道的readFile,我猜在这种情况下我需要以某种方式包装 toArray ?这可以完成还是必须由 mongoskin 实现?

一个例子可以是任何一组回调,查找/插入,查找/查找/插入,查找/更新:

req.db.collection('users').find().toArray(function (err, doc) {
  if (doc) {
    req.db.collection('users').find().toArray(function (err, doc) {
      // etc...
    });
  }
  else {
    // err
  }
});

您可以使用 bluebird 来 Promisify 整个模块:

var Promise = require("bluebird");
var mongoskin = require("mongoskin");
Object.keys(mongoskin).forEach(function(key) {
  var value = mongoskin[key];
  if (typeof value === "function") {
    Promise.promisifyAll(value);
    Promise.promisifyAll(value.prototype);
  }
});
Promise.promisifyAll(mongoskin);

此操作只需在应用程序中的一处完成一次,而不是在应用程序代码中的任何地方完成。

之后,您只需正常使用除 Async 后缀之外的方法,并且不传递回调:

req.db.collection('users').find().toArrayAsync()
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  })
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  })
  .then(function(doc) {
    if (doc) {
      return req.db.collection('users').find().toArrayAsync();
    }
  });

再说一次,如果你调用像这样的函数

foo(a, b, c, function(err, result) {
    if (err) return console.log(err);
    //Code
});

承诺返回版本的调用方式如下:

fooAsync(a, b, c).then(...)

(未捕获的错误会自动记录,因此如果您只想记录它,则无需检查它们)

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

Node.js 与 mongoskin 的承诺 的相关文章

随机推荐

  • WinRT 投影类型文档

    有一种东西叫做预测类型在 WinRT 中 例如 在元数据中 IXamlType UnderlyingType定义为 TypeName UnderlyingType get 然而 当在 C 应用程序中使用时 它会发生如下变化 Type Und
  • 自定义 Flask 管理行操作

    我想在烧瓶管理列表视图上的编辑和删除图标旁边添加另一个按钮 此外 我想将该行数据作为发布请求发送到路线 我知道我必须编辑admin model list html模板 但我不知道如何添加此功能 你能提供任何指导吗 您需要为您的视图定义自定义
  • 如何使用 Typesafe Activator UI 在开发模式下运行 play 项目

    我正在使用 Typesafe Activator 1 2 10 我使用模板 play scala 中的 activator ui 创建了一个新项目 当我单击开始时 游戏正在产品模式下运行 我想在开发模式下运行它 如何使用 activator
  • 将单元格位置字符串解析为行和列

    i have string col AB21 这是 Excel 单元格位置 我想将其解析为string column AB int row 21 我怎样才能做到这一点 string col AB21 int startIndex col I
  • x86指令编码表

    我正在重写我的汇编程序 同时我也对实现反汇编感到好奇 我想让它变得简单和紧凑 并且在这样做时我可以利用一些概念 可以从操作码确定 x86 指令编码的其余部分 也许也需要前缀字节 我知道很多人都写了表格来做到这一点 我对助记符不感兴趣 而是对
  • 为什么append修改传递的切片

    我如何迭代切片并将切片传递到除当前元素之外的某个位置 似乎append 正如我们在文档中看到的那样 函数修改了底层切片 但无论如何我仍然不知道如何达到这个目标 func main args string 2 3 8 for i range
  • Pandas - Groupby 并创建新的 DataFrame?

    这就是我的情况 In 1 data Out 1 Item Type 0 Orange Edible Fruit 1 Banana Edible Fruit 2 Tomato Edible Vegetable 3 Laptop Non Edi
  • HA gearman 作业服务器的最佳实践是什么

    在 gearman 的主页上 他们提到运行多个作业服务器 因此如果一个作业服务器挂掉 客户端可以选择一个新的作业服务器 根据下面的陈述和图表 作业服务器似乎不相互通信 我们的问题是那些在死亡的作业服务器中排队的作业会发生什么 为这些服务器提
  • 不使用“if”来执行此操作 | if(s == "值1"){...} else if(s == "值2") { ...}

    根据反如果运动 http www antiifcampaign com 最佳实践是不在我们的代码中使用 if 谁能告诉我是否可以去掉这段代码中的 if 开关也不是一个选项 重点是删除条件逻辑 而不是用类似的语言结构替换 if if s fo
  • 有没有办法在 go 中将整数转换为布尔值,反之亦然?

    是否有内置方法将布尔值转换为整数 反之亦然 我尝试过正常的转换 但由于它们使用不同的基础类型 因此不可能以经典的方式进行转换 我翻了一些规范 还没有找到答案 Int 到 bool 很容易 只需x 0会成功的 反之 由于 Go 不支持三元运算
  • 如何更改节点版本? “您请求的“节点”版本“8”与您的全局版本“10”不匹配

    当我在终端 firebase 模拟器中运行时会发生这种情况 start 低于所有输出 i emulators Starting emulators functions hosting hub emulator hub started at
  • 在 YARN 上运行 Spark 应用程序,无需 Spark-submit

    我知道 Spark 应用程序可以使用 YARN 在 YARN 上执行spark submit master yarn 问题是 是否可以使用yarn在yarn上运行Spark应用程序yarn命令 如果是这样 YARN REST API 可以用
  • Android Studio 启动失败 - ClassNotFoundException:com.intellij.ide.plugins.PluginManager

    在新的 Win8 1x64 机器上安装 Android Studio 后 每当我尝试启动它时 都会出现ClassNotFoundException com intellij ide plugins PluginManager并且 Studi
  • django ModelForm save() 方法问题

    我有一个模型表格 class SnippetForm ModelForm class Meta model Snippet exclude author slug 我希望能够使用以下方法编辑特定实例 def edit snippet req
  • 无法在ubuntu 16.10上安装mongodb

    我正在尝试按照以下步骤安装 mongodbmanual https docs mongodb com manual tutorial install mongodb on ubuntu 我使用的是ubuntu 16 10 我之前已经成功安装
  • 云代工租户 - 什么?

    我读了一些关于 Cloud Foundry 的文档 但没有找到这个术语tenants 我的问题是 Org 是否是云代工厂术语中的租户 如果不是 相当于什么 可以这样做 您可以设置 CF 安装 使一个组织成为一个租户 组织的范围是这样的 组织
  • PHP PEAR Auth 会话超时

    这个问题已经快把我逼疯了 在两个独立的项目 都使用 PEAR 作为库 但编写在完全不同的自定义框架上 中 我使用 PEAR Auth 进行使用会话的身份验证 登录后 用户会在闲置的一个小时左右内注销 我没有具体的时间 但是很短 我尝试了以下
  • 模拟类和断言方法调用

    困惑于如何模拟一个类并能够断言它的方法是用一些参数调用的 当我断言调用时 我得到一个 未调用 断言 但是 我可以在mock calls属性 sandbox module py class Subject object def init se
  • 在 OSX 上的 MonoDevelop 2.2 Beta 1 中命中断点

    刚刚在 OSX Snow Leopard 上安装了 MonoDevelop 2 2 Beta 1 一切都很好 我创建了一个新的 ASP NET Web 项目并运行它 到目前为止 一切都很好 但后来我在后面的代码中放置了一个断点 但它没有命中
  • Node.js 与 mongoskin 的承诺

    我试图在进行 mongodb 查询时避免使用回调 我正在使用 mongoskin 来拨打电话 如下所示 req db collection users find toArray function err doc res json doc 在