在 mocha 中测试 NodeJS 时,域无法正确捕获错误

2023-12-07

当运行利用域进行错误处理的测试时,即使库内的域处理程序应该捕获错误,Mocha 仍然会抛出错误。如果我在 Mocha 之外执行代码,它会正常运行,让我相信问题出在 Mocha 上。

Example:

foo.js

module.exports = function(done) {
    var domain = require("domain");
    var d = domain.create();

    d.on("error", function() {
        done();
    });

    d.run(function() {
        throw new Error("foo");
    });
}

test.js- 内部抛出错误foo.js没有被域捕获。

describe("test", function() {
    it("should succeed", function(done) {
        var foo = require("./foo.js");
        foo(function() {
            console.log("done");
            done();
        });
    });
});

result : error thrown

脚本.js- 错误被域正确捕获并冒泡。

var foo = require("./foo.js");
foo(function() {
    console.log("done");
});
result : done

正如你在上面看到的,如果我直接节点到script.js它按预期运行,错误被域处理程序捕获并且代码继续。如果我在 Mocha 测试中运行相同的代码块,该错误会停止测试并给出失败。我相信这是因为错误是在 uncaughtException 处理程序或类似的处理程序上发送的。另一个复杂之处是,如果我在函数调用周围有一个 process.nextTick() ,那么它在 Mocha 中可以正常工作,这让我相信 Mocha 只能处理同步错误,但可以很好地处理异步错误。

这里有一些关于这个问题的讨论:https://groups.google.com/forum/#!msg/nodejs/n-W9BSfxCjI/SElI1DJ_6u0J and https://github.com/joyent/node/issues/4375 .

我感到困惑的是,所有这些讨论似乎都表明问题在几个月前就已经得到解决。任何人都知道该问题的简单解决方法,或者为什么我没有看到其他人似乎认为目前已经修复的错误得到修复。

我在 Windows 7 上的 CentOS 6.3 Vagrant VirtualBox 上运行节点 v0.10.18 和 Mocha 1.13.0。


发现问题了。NodeJS 域捕获同步错误,但事件继续冒泡到 try/catch。如果你包裹一个domain.run() in a try/catch然后域错误处理程序和 catch 将被执行。

因此,似乎最佳实践是在所有内部使用 process.nextTickdomain.run()。这在文档示例中显示,但没有像我希望的那样明确表达。

Example:

d.run(function() {
    process.nextTick(function() {
        // do stuff
    });
});

在这种情况下,缺陷不在 Mocha 中。

NodeJS 域在 try/catch 中未捕获同步错误的证明:https://gist.github.com/owenallenaz/7141699

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

在 mocha 中测试 NodeJS 时,域无法正确捕获错误 的相关文章

  • 以html格式显示npm审计漏洞

    有没有办法将 npm 审计报告显示为 html 页面 目前我只能看到使用以下命令以 json 格式输出报告的选项 npm audit json 我写了一个NPM包 https www npmjs com package npm audit
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • Visual Studio 代码断点在使用 TypeScript 的 Node.js 上不起作用

    我尝试了很多解决方案 但没有人适合我 代码执行 但我无法放置断点并调试它 请你帮助我好吗 我尝试过以下 VSCode 配置脚本 type node request launch name Typescript Node JS program
  • NodeJs 控制台中的 GET /bla - - ms - - 是什么意思?

    当我进入页面时 bla在我的 NodeJS 应用程序中 控制台打印出 GET bla ms 用文字来说 为了更容易谷歌搜索 dash dash ms dash dash 这是什么意思 这是输出morgan https github com
  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • Child_process 处理带有回车符 (\r) 的 STDOUT 流

    我正在编写一个简单的应用程序 它允许工作中的内部系统请求从远程服务器到使用 REST 调用发起的另一个远程服务器的复制过程 使用 rsync 我已经对express框架足够熟悉 并且刚刚开始尝试child process库 并偶然发现了一个
  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • Cloud Functions for Firebase - 通过 Nodejs/Cloud Function 将多个 PDF 合并为一个

    我遇到了一个问题 我试图通过云功能合并一堆 PDF 然后将合并的 PDF 下载到用户的计算机上 我的提供程序中有一个函数 它调用云函数并传递指向 pdf 的 URL 数组 如下所示 mergePDFs pdfs Create array o
  • nodejs (libuv) 事件循环是否在一个阶段(队列)中执行所有回调,然后再进入下一阶段或以循环方式运行?

    我正在研究 Node js 中 libuv 提供的事件循环 我遇到了关注 Deepal Jayasekara 的博客 https blog insiderattack net event loop and the big picture n
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • nvm 与 npm 配置“前缀”选项不兼容:

    我正在尝试运行另一个 NodeJS 版本nvm但出现此错误 nvm use v4 2 4 nvm is not compatible with the npm config prefix option currently set to Us
  • 如何使用 cradle (CouchDB) 将参数传递给视图

    Using cradle https github com cloudhead cradle 如何将参数传递给 CouchDB 中的视图 Update 假设我想返回与其他属性匹配的文档 key 默认 document format key
  • Node Sass 没有绑定您当前的环境

    我在 SO 上看到过很多这样的问题 但似乎没有一个能解决或匹配问题 Node Sass 找不到适合您当前环境的绑定 带有 Node js 6 x 的 Windows 64 位 奇怪的是 我没有安装 Node js 6 x 从命令行 node
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务

随机推荐

  • 字段列表中的未知列

    我正在尝试使用 Pascal 向 MySQL 插入一些信息 但是当我运行该程序时出现错误 字段列表中未知列 mohsen 这是我的代码 procedure TForm1 Button1Click Sender TObject var aSQ
  • 具有共享变量(值)的 Python 多处理 Pool.apply_async

    对于我的大学项目 我正在尝试开发一个基于 python 的流量生成器 我在 vmware 上创建了 2 台 CentOS 机器 我使用 1 台作为我的客户端 1 台作为我的服务器机器 我用过IP 别名仅使用单个客户端 服务器计算机来增加客户
  • 从长度不等列表的列表创建数据框

    我尝试转换这样的列表 l 1 2 3 17 4 19 5 到一个数据帧 其中每个数字作为索引 列表的位置作为值 例如 19 在第二个列表中 因此我希望得到某一行以 19 作为索引 1 作为值的行 依此类推 我设法得到它 参见下面的锅炉板 但
  • 在间隔内向两条线添加值时,图表移动不流畅

    我正在使用更新样条图来显示每秒变化的线 更改在chartinfo chart events load 中设置 下面是我在实际程序中使用的代码 chartinfo chart events load function powerLine th
  • 在 Mac Excel 2011 中从 Mysql DB 获取数据的 VBA 代码

    我在 Windows 中使用 ADODB 代码从 Mysql 数据库获取数据 并且工作正常 但是 我似乎无法让我的 Excel 工作簿 使用 ADODB 与 Excel Mac 2011 一起使用 经过大量谷歌搜索 我找到了来自 Actua
  • HTTR R,CURL,无法加载 PEM 证书?

    我正在尝试发出 API 请求 并将我的 SSL 证书传递给 GET 的 config 参数 我最初让它工作了几周 但后来不得不重新安装 R 我进行了全新安装 删除了所有文件夹 安装了 R RTools RStudio 在这个新的 R 实例中
  • 在哪里可以找到权威的 Selenium WebDriver 与 Firefox 兼容性表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我在各种平台上使用 Selenium Java 和 Firefox Web Driver 参与过许多项目 我一次又一次地遇到我们使用的 Seleni
  • 在 R 中,在字符串中将大写字母切换为小写字母,反之亦然

    我对功能很熟悉toupper and tolower 但这并不完全给出我想要的东西 这是我拥有的字符串和我想要的字符串的示例 this This is the string THAT I have that tHIS IS THE STRI
  • cherry-pick 命令是否会生成同一提交的不同哈希码?

    我对樱桃采摘不太了解 只需要清除cherry pick命令在不同分支中生成相同提交的不同哈希代码 实际上 我正在挑选不同分支中的哈希码 在这里我注意到它正在生成现有提交的不同哈希代码 是它的工作流程还是这里存在任何问题 提交哈希不仅基于提交
  • 变量不会在颤动中动态更改文本

    我已经定义了我的应用程序 并且通过了counter变量作为构造函数 如下所示 class AppThreePlusThree extends StatelessWidget override Widget build BuildContex
  • 用PHP将EXIF写入JPG

    几天来 我尝试使用 PHP 在 JPG 图像中写入 或更新 EXIF 信息 地理标记 纬度和经度 在咨询了很多网站但没有成功之后 我认为最好的选择是使用Imagick 但是虽然我似乎可以使用setImageProperty 设置纬度和经度
  • rand() 返回相同的数字[重复]

    这个问题在这里已经有答案了 我正在使用 rand 在 C 中制作一个简单的示例 但尽管我使用 srand 但该函数始终返回相同的数字 这是代码 include
  • Angular:为组件字段提供对服务功能的引用并从模板调用它,但未按预期工作

    在我的 Plunker 里 修改的英雄之旅来自官方文档的应用程序 我在hero service doHeroesExist boolean console log doHeroesExist called this heroesExist
  • 如何使用 PHP 或 Ruby 从图像中删除某些颜色?

    假设有 3 个圆圈 红 蓝 黑 我只希望保留黑色圆圈 如何去除红色和蓝色圆圈 既然您要求 PHP 解决方案 首先加载你的图片图像从png创建或其他图像格式的类似功能 然后 使用imagesx and imagesy来获取图像的大小 现在 您
  • 如何使用CSS将子div居中对齐父div内?

    我是 html 和 css 新手 我不知道如何在父 div 内居中对齐子 div 这是我的代码 请回答并解决我的问题 CSS page position relative width 1220px height 670px backgrou
  • Flutter apk已安装但无法找到/打开

    我花了几周的时间试图解决这个问题 但我无法让它发挥作用 Context 颤振运行 我可以执行 flutter run 它将在我的手机上启动该应用程序 关闭应用程序后 我在应用程序页面中看不到它 我无法搜索它 访问 应用程序的唯一方法是转到设
  • 你能在 kivy 文件中换行吗?

    我的 kv 中有几行 文件非常长 80多个字符 我想知道是否有办法在下一行包装 继续它们 例如 我该如何从这个 Line points self pos 0 5 self pos 1 2 self pos 0 self width 5 se
  • Win32 - 从 C 代码回溯

    我目前正在寻找一种在 Windows 下从 C 代码 非 C 获取回溯信息的方法 我正在构建一个跨平台 C 库 具有引用计数内存管理功能 它还具有集成的内存调试器 可提供有关内存错误的信息 XEOS C 基础库 当发生故障时 启动调试器 提
  • Oracle JSON_OBJECT NULL ON NULL 子句不起作用

    我正在尝试让 Oracle 生成 JSONnullSQL 上的值NULL数据 如下 select json object key a value 1 key b value null null on null c1 json object
  • 在 mocha 中测试 NodeJS 时,域无法正确捕获错误

    当运行利用域进行错误处理的测试时 即使库内的域处理程序应该捕获错误 Mocha 仍然会抛出错误 如果我在 Mocha 之外执行代码 它会正常运行 让我相信问题出在 Mocha 上 Example foo js module exports