Nodejs Mongoose - 如何避免回调地狱?

2023-12-05

使用 Mongoose 一段时间后,我可能会做错。当你有太多回调时,我发现很难阅读,例如:

我想找到一个文档并更新它。我需要先找到它,然后update将在回调内findOne.

var sam = new Character({ name: 'Sam', inventory: {}});

Character.findOne({ name: 'Sam' }, function(err, character) {
      console.log(character);

      // now I want to update it.
      character.update({... }, function(err, characterID) {

          // now I want to know the size of the document after the update.
          Character.findOne({ _id: characterID }, function(err, character) {
            // Now update it again....
        });
    });

});

最终变成了意大利面条式的代码!

你明白我的意思吗?

有什么想法可以做得更好吗?

或者如果没有所有这些回调,mongodb 原生会更好?

EDIT:

Character.findOne({...}, function(err, character) {

    return character.update(...);

}).select("-field1 -field2").then(function(data) {
      //
}).catch(function(error) {
    // Handle any error from all above steps
}).done();

Error:

TypeError: Character.findOne(...).select(...).then(...).catch(...).done is not a function

您可以使用链接Node.js 中的 q 承诺

var Q = require('q');

function findOne(filter) {
    return Q.Promise(function(resolve, reject) {
        Character.findOne(filter, function(err, character) {
            resolve({
                err: err,
                character: character
            });
        });
    });
}

function update(data) {
    return Q.Promise(function(resolve, reject) {
        character.update(data, function(err, characterID) {
            resolve({
                err: err,
                characterID: characterID
            });
        });
    });
}

findOne({ name: 'Sam' }).then(function(data) {
    if (!data.err) {
        // now you can update it.
        return update(data.character);
    } else {
        throw new Error(data.err);
    }
}).then(function(data) {
    if (!data.err) {
        // now you can update it.
        return update(data.characterId);
    } else {
        throw new Error(data.err);
    }
    return findOne({ id: characterId });
}).then(function(data) {
    if (!data.err) {
        // now you can update it.
        return update(data.character);
    } else {
        throw new Error(data.err);
    }
}).catch(function(error) {
    // Handle any error from all above steps
}).done();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs Mongoose - 如何避免回调地狱? 的相关文章

  • Mongoose 在结果的 _id 字段中返回“new ObjectId”

    当我尝试查询时 结果包含 id其中包含 new ObjectId 的字段 如何避免这种 new ObjectId 并仅将哈希值包含为字符串 由于此问题 将数据作为 JSON 响应发送回失败 下面是一个基本的demo 我的查询代码 book
  • 如何使用 AWS S3 SDK 的 createPresignedPost 方法使 AWS S3 文件可供公开访问?

    我有一个用例将 AWS S3 存储桶保留为默认私有 但是 上传到 AWS S3 时将某些对象公开 我使用以下代码对 AWS S3 url 进行签名 并使用 ACL 设置作为public read module exports generat
  • NESTJS AWS Lambda 和 Sequelize 连接池

    由于我已经给出了下面代码片段中提到的池参数 因此是否有必要在每次 lambda 调用后关闭连接 这个 aws lambda 函数应该每分钟触发一次 池参数仅足以关闭连接吗 export const databaseProviders pro
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • 如何修改副本集配置?

    我正在运行一个 mongo 2 节点集群 并使用此副本集配置 config id repl1 members id 0 host localhost 15000 id 1 host 192 168 2 100 15000 我必须将这两个节点
  • node-mongodb-native MongoClient 意外关闭连接

    我一直在 mongodb 中搜索大量意外关闭的连接 但只能找到希望关闭连接的人提出的问题 我正在使用 node mongodb native 连接到数据库 但我不断收到看似随机的 错误 连接已关闭 消息 如果我手动重试请求 浏览器刷新 则请
  • 将数据从 javascript/html 页面发送到 Express NodeJS 服务器

    我正在使用 html5 和 javascript 开发 cordova 应用程序 该架构如下 电话应用程序向服务器请求某些内容 服务器请求 firebird 数据库 数据库回答服务器 服务器将所请求的数据提供给电话应用程序 在 html5
  • Nodejs 提供 1 个 api 端点和 1 个 html 页面

    这是我的问题 我从来没有在不使用express的情况下在node中写过东西 所以我发现很难创建一个具有基本API的服务器 我在网上找到的基本上是这样的 var http require http http createServer func
  • Javascript 充满好奇心

    当我调用这个 Promise 时 输出与函数调用的顺序不匹配 这 then出现在 catch 即使承诺 then之后被呼叫 这是什么原因呢 const verifier a b gt new Promise resolve reject g
  • mongoose 查询:通过 id 在数组中查找对象

    我怎样才能在此 Schema 中通过 id 找到图像 我有用户的 id 和我正在寻找的图像的 id 执行此操作的最佳方法是什么 在这种情况下 所有图像是否具有不同的 id 或者它们是否可以具有相同的 id 因为它们不属于同一用户 我的架构如
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • npm 命令未在请求中发送授权令牌 - 无法进行身份验证

    当我发出 npm 命令时遇到此问题 我收到一条消息 指出它无法通过 npm 注册表 托管在 Azure DevOps 中 进行身份验证 我怀疑这可能是因为它没有生成授权标头并发送它连同请求 例如 当我发出这些命令时 npm ping or
  • 有没有办法从 webstorm (mac) 运行 mongod

    在这个线程中 从 webstorm 运行 mongod exe https stackoverflow com questions 21068248 running mongod exe from webstorm 它指出 mongo4id
  • Nodejs 的简单 put 请求,无需 Express

    我需要能够将 zip 文件上传到 Brightsign 单元 并考虑创建一个 Rest api 我可以发出 put 请求来发送 zip 文件 但问题是我找到的所有例子都是使用express之类的框架 是否可以在不使用额外框架的情况下在 No
  • MongoDB 的简单 HTTP/TCP 健康检查

    我需要为 Docker 容器内的 MongoDB 实例创建运行状况检查 尽管我可以采取解决方法并通过 CLI 使用 Mongo Ping 但最好的选择是创建一个简单的 HTTP 或 TCP 测试 标准 ping 测试中默认 27017 端口
  • 每次页面重新加载时都会出现新的 Google 登录库提示

    在我的项目中 我使用常规弹出客户端 JS 身份验证 平台客户端 https developers google com identity sign in web sign in 我从旧版 Google Sign 迁移到新版 Google I
  • MongoDb 如何按月和年聚合

    我是 mongodb 新手 正在尝试学习 MongoDB 查询 id ObjectId 59815d4704ca1760a45957ca userEmail email protected cdn cgi l email protectio
  • Angular 8 webpack-bundle-analyzer 寻找错误的polyfill 文件

    无论我做什么 构建项目后我都会收到以下错误 Error parsing bundle asset
  • 如何在node.js中找到两个地理点之间的距离?

    如何使用 node js 查找两个地理点 经度和经度的集合 之间的距离 我有使用谷歌地图距离矩阵服务的客户端 JavaScript 代码 我想在服务器端javascript中做同样的事情 在node js router js或datamod
  • 仅使用 find 方法查询 MongoDB 中的对象数组

    查看以下文档contactsMongoDB 3 4 上的集合 id ObjectId 58f045526320ef24fc61fdb2 name John Doe tags name tagA created at ISODate 2017

随机推荐

  • 使用 foreach 而不是 while 循环循环 mysql_fetch_assoc [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有一个 mysql 查询 result mysql query my query 有没有办法让这样的事情发挥作用 results mysql fetch assoc result f
  • Emacs 23、OS X、multi-tty 和 emacsclient

    如何让 emacs 23 在 OS X 上的多 tty 模式下正常工作 我已经添加 server start 到我的 emacs 并发现运行 Applications Emacs app Contents MacOS bin emacscl
  • 什么“类型”是从选择标签中选择的选项

    我是 PHP 新手 正在尝试获取从 select 标签中选择的选项的值 我熟悉某些类型的输入 例如单选 文本 复选框等 我的问题是 类型 是从选择标签中选择的选项 前三种形式工作得很好 但第四种则不行 这是我的代码
  • Akka 路由:回复发送到路由器最终成为死信

    我正在使用 Actor 路由 但无法将回复发送回路由器 以便路由列表中的另一个 Actor 可以接收到此消息 我在用着 sender tell Message context parent 为了根据 akka 文档回复路由器 路由参与者将发
  • 带有 .htaccess 的 SEO 友好 URL

    有人可以帮我重写一些 URL 吗 我有 例如 这些页面 www mydomain com test gallery asp id 2 www mydomain com test gallery asp id 3 并希望他们被要求为 www
  • html onchange 事件不起作用

    我正在尝试做一些实验 我想要发生的是 每次用户在文本框中输入内容时 它都会显示在对话框中 我用的是onchangeevent 属性来使其发生 但它不起作用 我仍然需要按提交按钮才能使其正常工作 我读到了有关 AJAX 的内容 并且正在考虑了
  • 哪些 lua 功能可以用作 python 或 tcl Expect 中的 pexpect?

    我有一些 shell 脚本 它们将一些消息打印到 stdout 并且如果输出与某些正则表达式匹配 我想生成一些其他进程 我可能还想将 shell 挂起一段时间 直到其他进程给出一些反馈 我的要求基本上表现得像shell中的pipe和tcle
  • mongoDB 中的嵌套对象文本搜索

    我不确定如何解决这个问题 我想在 mongoDB 集合中搜索并仅返回适合搜索查询的嵌套对象 在所有字段上使用文本搜索 该集合中的所有文档都具有以下格式 arr id 1 name Random description Hello world
  • 在 RealityKit 中启用手势

    我有一个自定义的 usdz 文件 不是通过代码创建的 而是一把真正的椅子 我将其保存在Entity 一旦我有了它 这就是我的代码 func updateUIView uiView ARView context Context if let
  • XSLT-标准化不间断空白字符

    我有一个像这样的示例 xml 文件
  • Azure 门户错误:无法启动虚拟机“xxxx”。错误:URL“xxxx”引用的 Key Vault 机密不存在

    在假设我的配置中的任何地方都没有使用这些密钥保管库并且这些是我的测试留下的一些内容之后 我从资源管理器中删除了一些密钥保管库 现在我无法启动虚拟机并出现此错误消息 无法启动虚拟机 xxxx 错误 Key Vault 机密 使用 URL xx
  • 使用套接字连接 nat 后面的 ip

    考虑一部通过电话 A 连接到 wifi 的电话 地址为动态 Ipex 192 168 0 34及其监听服务器套接字port 7567 如果我有另一部电话 B 来连接公共 ip 上的电话 我可以通过什么方式使用任何编程语言连接到该套接字10
  • Orderby ACF 自定义字段日期不起作用

    我查看了另一篇文章 但什么也没找到 我已经上线 3 天了 我想按顺序显示 3 个 事件 ASC但2018年总是在2017年之前 auj date Ymd queryEvent new WP Query array category name
  • 由于 data.table 被引用更改,微基准测试结果检查失败

    SO 有一些答案 其中比较了时间without检查结果 不过 我更喜欢看看表达式是否正确and fast The microbenchmark包支持这一点check范围 不幸的是 对改变 a 的表达式的检查失败data table 引用 即
  • 如何限制 html 选择框中选择的选项?

    我在制作的表单中使用了 select 标签 允许进行多项选择 但我希望将最大选择数量设置为 10 使用 javascript 或 jquery 可以吗 提前致谢 这里有一些完整的代码供您使用 一定喜欢 Google AJAX API Pla
  • Xcode 8 beta 4:在物理设备上运行时“无法附加到 pid:1110”

    我做了一个消息扩展 当我在 iOS 模拟器上运行它时 一切都运行没有问题 当我尝试在手机上运行它时 它会编译并显示运行大约 5 秒 然后崩溃 并在 Xcode 中弹出一条消息 显示Could not attach to pid这是一个屏幕截
  • 如何在 c#.net3.5 中的按钮单击事件上设置焦点并启动已经运行的应用程序?

    我一直在尝试使用互斥体的代码 但单击按钮后无法打开我的 exe 我成功地没有在单击按钮时在任务栏上多次输入应用程序 但只有当我关闭表单时才会启动我的应用程序 我想在单击按钮时启动我的应用程序 如果应用程序已经启动 那么我需要关注以前运行的应
  • Android - 使用自定义字体

    我将自定义字体应用于TextView 但似乎并没有改变字体 这是我的代码 Typeface myTypeface Typeface createFromAsset getAssets fonts myFont ttf TextView my
  • 实现自定义会员用户和自定义会员提供者

    参考 http msdn microsoft com en us library 6tc47t75 28v VS 80 29 aspx http msdn microsoft com en us library ms366730 aspx
  • Nodejs Mongoose - 如何避免回调地狱?

    使用 Mongoose 一段时间后 我可能会做错 当你有太多回调时 我发现很难阅读 例如 我想找到一个文档并更新它 我需要先找到它 然后update将在回调内findOne var sam new Character name Sam in