我遇到了domain
模块的问题。目前,我正在尝试捕获请求中抛出的任何未捕获的错误。使用express
中间件和域。所有请求都会在调用next
之前通过此函数进行路由,然后继续执行它的正确路由。
app.use (req, res, next) ->
domain = createDomain()
domain.on "error", (err) ->
res.send(500)
domain.dispose()
domain.enter()
next()
问题是,如果永远不会抛出错误,我该如何处置域?
我可以在中间装置之外提升领域和事件,所以我不需要处理,但是我将无法访问需要发送500的中间装备。
有没有人有更好的解决方案来处理这个问题?我花了太多时间试图找出一种方法(以及许多hacky方式)来处理这个问题。感谢。
答案 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。