无法在适当的时间调用域名处理

时间:2013-02-20 01:55:40

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

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

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

    domain.enter()
    next()

问题是,如果永远不会抛出错误,我该如何处置域?

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

简而言之,不要尝试将enter与dispose配对,也不要尝试跨异步边界使用enter / exit。使用run / bind / add / remove。