【问题标题】:Unable to call dispose on domain at appropriate time无法在适当的时间调用域上的 dispose
【发布时间】:2013-02-20 01:55:40
【问题描述】:

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

app.use (req, res, next) ->
    domain = createDomain()
    domain.on "error", (err) ->
        res.send(500)
        domain.dispose()

    domain.enter()
    next()

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

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

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

【问题讨论】:

    标签: javascript node.js express middleware node.js-domains


    【解决方案1】:

    如果没有发生错误,您无需致电domain.dispose()domain.dispose() 的目的是清理从堆栈中间跳出后处于不确定状态的任何资源,并抑制由于不良状态而发生的后续错误。 domain.enter() 的反向调用就是 domain.exit()

    也就是说,浏览域的代码,您似乎不想以这种方式使用domain.enter/exit。每个 domain.enter/exit 对应于 domain 模块代码中一个共享数组的栈 push/pop。因此,例如,如果第二个请求在第一个请求完成之前进入,然后第一个请求在第二个完成之前退出,则在第一个域处理程序中调用 exit 将弹出第二个请求的域。似乎很有可能进入和退出不应该在异步事物之间分开。

    您是否尝试过简单地使用domain.run(next)?这似乎对我有用。它基本上是为你进入域,然后调用你给它的回调,然后在回调返回后立即退出域。在域中创建的任何计时器或事件发射器也将与该域相关联。事件发射器在调用事件处理程序时也使用类似的进入-调用-退出模式。从代码中可以看出,跟踪事件处理程序的不是域,而是跟踪域的事件处理程序。

    简而言之,不要尝试将 enter 与 dispose 配对,也不要尝试跨异步边界使用 enter/exit。使用运行/绑定/添加/删除。

    【讨论】:

    • 谢谢。有机会我会试一试的。
    • @Jason - 当我尝试在中间件中使用猫鼬函数时,你知道为什么process.domainundefined 吗?似乎 process.domain 不是 undefined util 我在中间件中做了这样的事情:UserModel.findOne(function(err, function() { console.log(process.domain); //undefined });
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多