问题标签 [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 投票
5 回答
9629 浏览

node.js - 如何通过 express 使用 Node.js 0.8.x 域?

如何创建将每个请求包装在自己的域中的 Express/Connect 中间件?

0 投票
5 回答
5159 浏览

node.js - 无法使用 express 处理 node.js 域的异常

我想使用 Node.js 域来捕获异常。到目前为止它正在工作,但是有一个地方我无法让域来捕获异常。回调中的 exception2 在 domain.on('error') 处理程序中被捕获和处理,但 exception1 没有被捕获。奇怪的是,当异常 1 被抛出时,它并没有像我期望的那样关闭 Node。这是我的示例应用程序:

为了让异常 2 执行,我注释掉异常 1。

0 投票
1 回答
146 浏览

node.js - 为什么域不会捕获以下异常?

为什么域不处理以下错误?

同样,它与以下代码完美配合,

0 投票
1 回答
629 浏览

javascript - 无法在适当的时间调用域上的 dispose

我的domain模块有问题。目前,我正在尝试捕获请求中抛出的任何未捕获的错误。使用express中间件和域。所有请求都通过此函数进行路由,然后再调用next并转到正确的路由。

问题是,如果从未抛出错误,我该如何处理域?

我可以在中间件之外提升域和事件,所以我不必处理,但是我将无法访问我需要发送 500 的中间件参数。

有没有人对我如何处理这个问题有更好的解决方案?我花了太多时间试图找出一种方法(以及许多 hacky 方法)来处理这个问题。谢谢。

0 投票
1 回答
198 浏览

javascript - 如何在nodejs中正确使用域

我尝试使用domains核心模块而不是process.on('uncaughtException'), 来捕获错误

并在 express 中用作中间件,但似乎

不叫

我想在响应结束时处理域

如何正确地做到这一点,或者我不必这样做?

0 投票
1 回答
202 浏览

javascript - node.js为每个房间定义相同的数组不同

正如我在标题中所说,我想为每个房间定义一个不同的数组。例如:

对于room1,数组将是var colors=['red','blue'],

对于room2,数组将是var colors=['black','white']。(同名但内容不同)

这是我的简化服务器:

我不想要这样的东西,if(h=='room1') { var colors=['a','b'];} elseif(room=='room2') { var colors=['y','z']; }因为会有很多房间。

我怎样才能做到这一点?我应该使用命名空间而不是房间吗?

0 投票
0 回答
184 浏览

node.js - NodeJS 域模块没有干净地退出

我一直在试验节点 JS 中的域。代码完成了我的预期,但是当代码完成时,节点没有干净地退出,这让我觉得有一些未收集的垃圾或我不明白的东西。有什么建议么?这是一个精简的例子:

0 投票
4 回答
4940 浏览

node.js - 使用域和 socket.io 处理 Nodejs 错误

我刚刚开始在 nodejs 中使用域进行错误管理。

当我将它们与 socket.io 一起使用时,有些东西我无法理解。

这是我的示例代码:

我开始将所有代码放入“运行”方法中

但如果 cb1 或 cb2 发生错误,则不会处理!

然后我在 che cb1 上使用了绑定方法

但是如果在 cb2 中发生错误,它不会被处理!

我的问题是:我是否必须在每个回调上放置一个“绑定”?在服务器和所需的文件中?

当我开始研究这些领域时,所有教程都将它们定义为单点处理错误的最佳解决方案!

我错过了什么吗?

0 投票
2 回答
204 浏览

node.js - 为什么 NodeJS 域文档代码试图终止进程?

在 NodeJS 官方文档中,有一个代码示例,当域中出现异常时,进程会尝试正常退出(它关闭连接,等待一段时间等待其他请求,然后退出)。

但是为什么不发送 500 错误并继续工作呢?

在我的应用程序中,当用户输入无效时,我想抛出一些预期的错误(如 FrontEndUserError),并在中间件的某处捕获这些异常以向客户端发送漂亮的错误消息。使用域很容易实现,但是这有什么陷阱吗?

0 投票
1 回答
201 浏览

node.js - 如何在 node.js 域中添加全局发射器?

在我的 node.js 应用程序中,我曾经按域处理错误。该应用程序的架构如下所示:

  1. 控制器。快速路由调用控制器方法

  2. 控制器调用服务和使用模型

  3. 服务调用存储库

(其实和DDD很像)。

因此,控制器创建域,并在域中运行其实际主体。如果出现问题,服务会抛出异常。控制器还监听域错误并处理它们。它非常舒服,因为我不需要担心在所有服务的方法调用堆栈上出现错误——我只是抛出一个异常并且可以确定它会在控制器中被捕获。

但是我遇到了与使用 PostgreSQL 相关的问题。我使用 node-postgres 模块,并在单独的 js 文件中创建 pg.Client,因此 pg.Client 就像为所有人共享(否则,在每个查询上创建 pg.Client 会打开许多​​与 postgres 的活动连接)。

问题在于,当 pg.Client 在单独的文件中定义时,它就像一个全局对象,并且不包含在控制器中创建的域范围内。因此从 pg.Client 回调抛出的异常不会被域捕获。

我将展示简化的请求处理方式以使其清楚。假设用户想通过 userId 登录:

  1. 在开始的 pg.Client 创建的某个地方

  2. 获取请求来快递,快递调用路由方式

  3. 路由调用一些控制器的方法

  4. 控制器创建域并在 «domain.run» 中调用服务

  5. 服务调用存储库

  6. Repository 获取之前创建的 pg.Client,并调用 sql 查询方法

  7. sql查询方法的结果放入回调中(所以这个回调被pg.Client调用)

  8. 然后回调在服务中处理,我们检查我们得到 null 而不是用户模型(因为给定 userId 在 db 中没有这样的用户)并抛出异常

因此该异常不会在域中捕获。从技术上讲,我们需要使用节点域的 «add» 方法并添加 pg.Client,但我所说的 pg.Client 是共享的,因此它将添加到不同的并发域中。

我将列出一些代码示例以使其更清楚。它是 UserService 的简化方法:

因此,该方法«login»在域中被调用。但它创建了 userRepository,调用 findByEmail 方法,该方法将使用位于域范围之外的共享 pg.Client,这就是为什么域中不会捕获异常的原因。

任何想法如何修复它并将 pg.Client 放入域中?