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 - 如何避免回调地狱? 的相关文章

  • 在 Node.js 中查找默认网关 IP 的最佳方法是什么?

    如今在 Node js 中查找默认网关 IP 地址的最佳方法是什么 os networkInterfaces 不提供此信息 想到的唯一想法是解析stdout子流程的route n Kernel IP routing table Destin
  • nodeJS + Swig 模板将变量传递给 javascript

    有没有办法使用nodeJS的express swig模板将变量从服务器端传递到客户端javascript 我知道这可以在 Jade 中完成 但我宁愿坚持使用更类似于 HTML 的模板引擎 感谢各位的帮助 好的 我假设您可以使用 consol
  • IE 中未定义“代理”

    我通过 React Node 构建了一个 Excel 插件Umi https umijs org 我们已经实施了我们的身份验证系统 身份验证在 Chrome 和 Safari 中有效 我刚刚意识到它在 IE11 中不能很好地工作 F12表明
  • 我可以使用passport-google回调来验证android/ios用户吗?

    我有一个使用 google passport oauth2 进行身份验证的 node js 服务器 我的服务器端代码看起来像这样文档 https www npmjs com package passport google oauth2 au
  • 未调用 Ajax 回调。如何解决这个问题?

    我再次来这里寻求您的建议 我有一些 AJAX 调用 用于从我的编辑器 PHP 在线编辑器 运行代码 大家可以来看看my site http web guru99 com 我有一些 ajax 调用来发送编辑器的数据并接收输出 问题 for 循
  • socket.io 发出多次触发的事件

    我在这里读过一些关于这个主题的问题 但我还不确定如何在我的情况下解决它 这getMsgs发出事件的触发次数与我访问的次数一样多 admin网址 我从 SO 的其他问题中知道 这是因为每次我访问时听众都会注册admin页面 但我不确定如何重构
  • Node.Js - 获取 Windows 用户名

    我正在尝试获取运行我的node jS应用程序的计算机的Windows用户名 该应用程序始终在Windows计算机上运行 如何使用 Node Js 获取当前的 Windows 用户名 我想找到类似的东西WindowsIdentity GetC
  • 如何在pm2下运行nuxt?

    我有 2 个 nuxt 项目需要在服务器上运行 每当我在本地运行该应用程序时 它似乎都在使用 npm run dev 但在服务器上 这需要在子进程下运行 所以我使用 pm2 来实现 但是每当我开始使用 pm2 运行相同的 npm 脚本时 该
  • 在 Nestjs 的我的模块中导入另一个模块的存储库

    我正在尝试使用 Nestjs 构建一个应用程序 目前我有两个模块 用户和身份验证 其结构如下 我需要注射用户服务 into 认证服务为了与User实体 所以首先我注入了用户存储库 into 用户服务并导出服务 用户 模块 ts import
  • 使用edge.js .Net C# 模块是否可以调用进程的node.js 部分,即进行反向调用?

    您可以看到从 Node js gt C 的互操作模型 here http tjanczuk github io edge 7 我想知道的是 C 代码可以在返回之前从 C 调用进程的 Node js 部分中的方法吗 想象一下 如果你接到一个电
  • 如何安装 grunt-cli 而不出现错误?

    灵感来自 Chris Coyierpost http 24ways org 2013 grunt is not weird and hard 我决定尝试一下 grunt 但我在设置时遇到了很大的问题 首先 我安装了 Node js 然后我将
  • 如何使用 next.js 将动态 html 元素注入到页面?

    如何使用next js动态注入html元素到页面 这些元素未知类型 例如 输入 复选框 img 使用返回 json 类型的 api 指定此元素 如下所示 id rooms title Rooms order 1 type string wi
  • Mac OS X Yosemite 中的 Node.js dtrace 错误

    我在 Mac OS X 10 10 Yosemite 上尝试使用 DTrace Node js 应用程序 sudo dtrace n profile 97 execname node arg1 jstack 150 8000 count t
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 如何通过aws-sdk(javascript或node)获取s3存储桶大小

    我尝试使用 javascript nodejs aws sdk 查找 获取 s3 存储桶信息 但没有找到这样的 api 如何通过 aws sdk javascript 或 node api 获取 s3 存储桶大小 信息 每天一次向 Clou
  • 使用 npm 作为构建工具连接文件

    我最近发现我可以使用 npm 作为任务运行程序 而不是 gulp 或 grunt 到目前为止 一切都很棒 lint stylus jade uglify watch 等 但串联部分 我似乎无法实现 gulp 是这样的 gulp task s
  • 将 mongodb 与 solr 集成的动机是什么 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Mongodb 是一个 nosql 数据库 除了全文搜索之外 任何查询都可以在其上运行 因为它会降低整体性能 Solr 是一个搜索引擎 当我们将
  • 使用 IP 地址连接到另一台计算机

    我在计算机上安装了 NodeJS 并运行了一些测试 一切正常my机器 现在我想要一个不在同一网络中的朋友连接到我的计算机 以便 NodeJS 可以响应我朋友的请求 但我不知道 我必须在哪个IP和端口上监听 我也不知道 我必须给我的朋友哪个I
  • 在 GraphQL 服务器中实现访问控制的好模式是什么?

    背景 我有一组模型 包括用户和各种其他模型 其中一些模型包含对用户的引用 我公开这些模型 以便通过 GraphQL API 生成的查询Graffiti https github com RisingStack graffiti 由 Mong
  • 如何删除控制台中打印的字符

    我一直在搜索如何用其他语言执行此操作 发现必须使用特殊字符 b 来删除最后一个字符 如何删除控制台应用程序中打印的字符 linux https stackoverflow com questions 430713 how do i eras

随机推荐

  • 使用 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