问题标签 [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.
node.js - 如何通过 express 使用 Node.js 0.8.x 域?
如何创建将每个请求包装在自己的域中的 Express/Connect 中间件?
node.js - 无法使用 express 处理 node.js 域的异常
我想使用 Node.js 域来捕获异常。到目前为止它正在工作,但是有一个地方我无法让域来捕获异常。回调中的 exception2 在 domain.on('error') 处理程序中被捕获和处理,但 exception1 没有被捕获。奇怪的是,当异常 1 被抛出时,它并没有像我期望的那样关闭 Node。这是我的示例应用程序:
为了让异常 2 执行,我注释掉异常 1。
node.js - 为什么域不会捕获以下异常?
为什么域不处理以下错误?
同样,它与以下代码完美配合,
javascript - 无法在适当的时间调用域上的 dispose
我的domain
模块有问题。目前,我正在尝试捕获请求中抛出的任何未捕获的错误。使用express
中间件和域。所有请求都通过此函数进行路由,然后再调用next
并转到正确的路由。
问题是,如果从未抛出错误,我该如何处理域?
我可以在中间件之外提升域和事件,所以我不必处理,但是我将无法访问我需要发送 500 的中间件参数。
有没有人对我如何处理这个问题有更好的解决方案?我花了太多时间试图找出一种方法(以及许多 hacky 方法)来处理这个问题。谢谢。
javascript - 如何在nodejs中正确使用域
我尝试使用domains
核心模块而不是process.on('uncaughtException')
, 来捕获错误
并在 express 中用作中间件,但似乎
不叫
我想在响应结束时处理域
如何正确地做到这一点,或者我不必这样做?
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']; }
因为会有很多房间。
我怎样才能做到这一点?我应该使用命名空间而不是房间吗?
node.js - NodeJS 域模块没有干净地退出
我一直在试验节点 JS 中的域。代码完成了我的预期,但是当代码完成时,节点没有干净地退出,这让我觉得有一些未收集的垃圾或我不明白的东西。有什么建议么?这是一个精简的例子:
node.js - 使用域和 socket.io 处理 Nodejs 错误
我刚刚开始在 nodejs 中使用域进行错误管理。
当我将它们与 socket.io 一起使用时,有些东西我无法理解。
这是我的示例代码:
我开始将所有代码放入“运行”方法中
但如果 cb1 或 cb2 发生错误,则不会处理!
然后我在 che cb1 上使用了绑定方法
但是如果在 cb2 中发生错误,它不会被处理!
我的问题是:我是否必须在每个回调上放置一个“绑定”?在服务器和所需的文件中?
当我开始研究这些领域时,所有教程都将它们定义为单点处理错误的最佳解决方案!
我错过了什么吗?
node.js - 为什么 NodeJS 域文档代码试图终止进程?
在 NodeJS 官方文档中,有一个代码示例,当域中出现异常时,进程会尝试正常退出(它关闭连接,等待一段时间等待其他请求,然后退出)。
但是为什么不发送 500 错误并继续工作呢?
在我的应用程序中,当用户输入无效时,我想抛出一些预期的错误(如 FrontEndUserError),并在中间件的某处捕获这些异常以向客户端发送漂亮的错误消息。使用域很容易实现,但是这有什么陷阱吗?
node.js - 如何在 node.js 域中添加全局发射器?
在我的 node.js 应用程序中,我曾经按域处理错误。该应用程序的架构如下所示:
控制器。快速路由调用控制器方法
控制器调用服务和使用模型
服务调用存储库
(其实和DDD很像)。
因此,控制器创建域,并在域中运行其实际主体。如果出现问题,服务会抛出异常。控制器还监听域错误并处理它们。它非常舒服,因为我不需要担心在所有服务的方法调用堆栈上出现错误——我只是抛出一个异常并且可以确定它会在控制器中被捕获。
但是我遇到了与使用 PostgreSQL 相关的问题。我使用 node-postgres 模块,并在单独的 js 文件中创建 pg.Client,因此 pg.Client 就像为所有人共享(否则,在每个查询上创建 pg.Client 会打开许多与 postgres 的活动连接)。
问题在于,当 pg.Client 在单独的文件中定义时,它就像一个全局对象,并且不包含在控制器中创建的域范围内。因此从 pg.Client 回调抛出的异常不会被域捕获。
我将展示简化的请求处理方式以使其清楚。假设用户想通过 userId 登录:
在开始的 pg.Client 创建的某个地方
获取请求来快递,快递调用路由方式
路由调用一些控制器的方法
控制器创建域并在 «domain.run» 中调用服务
服务调用存储库
Repository 获取之前创建的 pg.Client,并调用 sql 查询方法
sql查询方法的结果放入回调中(所以这个回调被pg.Client调用)
然后回调在服务中处理,我们检查我们得到 null 而不是用户模型(因为给定 userId 在 db 中没有这样的用户)并抛出异常
因此该异常不会在域中捕获。从技术上讲,我们需要使用节点域的 «add» 方法并添加 pg.Client,但我所说的 pg.Client 是共享的,因此它将添加到不同的并发域中。
我将列出一些代码示例以使其更清楚。它是 UserService 的简化方法:
因此,该方法«login»在域中被调用。但它创建了 userRepository,调用 findByEmail 方法,该方法将使用位于域范围之外的共享 pg.Client,这就是为什么域中不会捕获异常的原因。
任何想法如何修复它并将 pg.Client 放入域中?