问题标签 [node.js-domains]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
294 浏览

node.js - 如何在带域的节点中进行正确的错误处理?

我正在使用第三方库。它使用节点domain进行错误处理。如果传递给该第三方库的回调函数有任何错误,它最终会多次调用我的回调。

示例代码是:

我们将此错误报告给第三方库,他们已经修改了源代码。喜欢:

现在函数被多次调用的问题得到了解决。但是最终的回调永远不会被调用。

如何处理节点的这种行为?

如果第三方库修改那里的代码,它会导致应用程序崩溃。放置一个包装域也无济于事。

在 node 中处理此类案件的最佳方法是什么?

0 投票
1 回答
268 浏览

javascript - node.js 域会自动清理自己还是我必须调用 domain.dispose()

我对node.js 域有点困惑。我正在使用它们来捕获异步代码中可能引发的错误。

不过,我不确定,域是否会在完成后自动清理垃圾收集domain.run(blah),或者在完成domain.dispose()域后是否必须手动调用?

问题domain.dispose()在于它还破坏了域可能一直在拦截的所有 io 流,这不是我想要的,因为我只是使用这个特定的域来捕获异步代码中抛出的错误。

0 投票
2 回答
2835 浏览

node.js - 在 mocha 中测试 nodeJS 时域无法正确捕获错误

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

例子:

foo.js

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

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

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

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

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

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

0 投票
1 回答
625 浏览

node.js - 域可以嵌套在 node.js 中吗?

使用同步错误,您可以像这样嵌套错误范围:

这就是我期望它工作的方式,但它没有(似乎域错误处理程序中的错误被抛出到顶部,跳过中间的任何域):

有没有办法做到这一点?

0 投票
1 回答
151 浏览

node.js - 节点光纤会破坏节点域吗?

我目前正在使用节点光纤来编写同步服务器端代码。我主要通过 try-catch 块进行错误处理,但在外部库或其他少量异步代码中总是有可能发生错误。我正在考虑使用新的域功能尝试将这些错误路由到正确的请求,我想知道是否有人尝试在同一个应用程序中使用纤程和域。

根据域在幕后的工作方式,我可以想象纤程可能会破坏一些用于将异步代码与正确域相关联的假设。具体来说,我担心域可能会执行以下操作来跟踪上下文,这可能会与纤程中断,因为纤程破坏了函数将在任何其他代码运行之前运行完成的保证:

有没有人成功或不成功地尝试让光纤和域一起玩?

0 投票
2 回答
1778 浏览

javascript - Node.js 域集群工作者断开连接

查看nodejs域文档页面中给出的示例:http ://nodejs.org/api/domain.html ,使用集群重启worker的推荐方法是在worker部分调用first disconnect,并监听disconnect主部分中的事件。但是,如果您只是复制/粘贴给出的示例,您会注意到 disconnect() 调用不会关闭当前工作程序:

这里发生的是:

  1. 我在 /error 做一个获取请求

    • 启动一个计时器:在 30 秒内,如果尚未终止该进程,则该进程将被终止
    • http服务器已关闭
    • 工人断开连接(但仍然活着)
    • 显示500页
  2. 我在错误时执行了第二次获取请求(30 秒之前)

    • 新计时器开始
    • 服务器已经关闭 => 抛出错误
    • 错误在“catch”块中被捕获,并且没有结果被发送回客户端,因此在客户端,页面正在等待,没有任何消息。

在我看来,最好只是杀死工人,然后在 master 部分听 'exit' 事件再次分叉。这样,500 错误总是在错误期间发送:

我不确定使用 kill 而不是断开连接的负面影响,但似乎断开连接正在等待服务器关闭,但似乎这不起作用(至少不像它应该的那样)

我只是想要一些关于这个的反馈。我错过了这个例子的编写方式可能有一个很好的理由。

谢谢

编辑:

我刚刚检查了 curl,它运行良好。
但是,我之前使用 Chrome 进行了测试,似乎在发回 500 响应之后,chrome 在服务器实际结束关闭之前执行了第二个请求。
在这种情况下,服务器正在关闭而不是关闭(这意味着工作人员也在断开连接但没有断开连接),导致第二个请求由与之前相同的工作人员处理,因此:

  1. 它可以防止服务器完成关闭
  2. 正在评估的第二server.close();行,它触发了一个异常,因为服务器没有关闭。
  3. 在调用 killtimer 回调之前,所有后续请求都将触发相同的异常。
0 投票
3 回答
3661 浏览

node.js - NodeJS 域和 expressjs

ExpressJS 的新手问题:

我计划创建一个相当简单(但很大)的 ExpressJS 项目,该项目响应 REST 请求并执行只读数据库响应。我已经阅读了有关用于捕获错误的 NodeJS 域,但我不清楚这个项目是否需要它。我的测试似乎表明,即使在最糟糕的未捕获抛出和崩溃中,也只有单个 REST 请求失败,而不是整个服务器。

我对么?NodeJS 域 API:http ://nodejs.org/api/domain.html#domain_class_domain

(显然,我问的原因是域功能在项目结束时很难在事后实现)。

如果不需要,这篇文章让我对 NODEJS for Express 的想法感到冷淡:(如果不需要,我不会使我的代码复杂化)。

Node.js - 每个 Express 请求的域,在另一个域内

0 投票
1 回答
314 浏览

javascript - 是否需要处置 node.js 域?什么时候应该做?

我有一个 Express 应用程序,并且每个收到的请求都使用域。我添加了一个中间件,以确保在域“内部”执行任何进一步的中间件。

此外,在处理请求时执行的一些代码process.domain.req用于获取对初始请求的引用,它是标头、cookie 等......我这样做是因为'我无法req直接传递给此代码。这个奇怪的代码是一种不知道在哪里执行的跨环境代码(对于浏览器和节点)。在底层,一些基础层对 Node 和浏览器的实现方式不同,尤其是网络代码。对于浏览器,它是一个 XMLHttpRequest,对于 NodeJS,它是一个基于requestlib 的自定义包装器。

我担心内存泄漏。对req存储在域上的引用。他们可以保留这些东西并让它们不被垃圾收集吗?

另外,我是否需要定期处理域,还是需要在某些边缘/错误情况下处理它们?

0 投票
1 回答
136 浏览

node.js - Sencha Touch Post 到 Node.js 错误

我正在尝试从跨域 node.js 获取带有 Sencha Touch 的 json

我的 node.js 代码:

这里的代码工作正常:http ://still-stream-9036.herokuapp.com/login

但是当我尝试使用 sencha touch 时,我得到了:

0 投票
1 回答
542 浏览

node.js - node.js 域内存泄漏

我将一个新域附加到我的 Express 应用程序中的每个传入请求,就像在node.js 文档中的示例中一样。

但是,我注意到我正在泄漏内存。当我在 Chrome 中执行heapdump并检查它时,我注意到应该立即丢弃的类实际上被旧域保留。

我应该做些什么来告诉 node.js 不要保留旧域?