2013-02-20 29 views
4

我对domain模块有问题。目前,我试图捕获请求中引发的任何未捕获的错误。使用express中间件和域。在拨打next并转到正确的路线之前,所有请求都通过此功能路由。无法在适当的时间在域上调用处置

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

    domain.enter() 
    next() 

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

我扯起middlewear外域和事件,所以我不曾经有部署,但后来我将无法访问,我需要发送500

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

回答

5

如果没有发生错误,则不需要拨打domain.dispose()domain.dispose()的目的是清理在跳出堆栈中间后处于不确定状态的任何资源,并且抑制由于错误状态而导致的后续错误。 domain.enter()的反向调用只是domain.exit()

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

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

简而言之,不要试图将输入和配置配对,也不要尝试在异步边界之间使用输入/输出。使用运行/绑定/添加/删除。

+0

谢谢。当我有机会的时候,我会给这个机会。 – Trevor 2013-03-06 18:16:51

+0

@Jason - 你知道为什么'process.domain'是'undefined',只要我尝试在我的中间件中使用猫鼬函数?看起来process.domain不是undefined util我在中间件中做了这样的事情: 'UserModel.findOne(function(err,function(){console.log(process.domain); // undefined});' – ragulka 2013-03-26 08:54:14

+0

@ragulka请参阅https://github.com/LearnBoost/mongoose/pull/1337 – sandinmyjoints 2013-12-08 21:55:39

相关问题