Node.js Express应用程序处理启动错误

我在Node.js和Express中有应用程序。 我需要为它写testing。 我在处理Express应用程序错误时遇到问题。 我发现这个如何捕获像EADDRINUSE node.js / express服务器错误? ,但这对我不起作用,我不知道为什么。 我想要处理在expressApp.listen()正在执行时发生的错误(EADDRINUSE,EACCES等)。

express = require('express') listener = express() #doesn't work for me listener.on('uncaughtException', (err) -> #do something ) #doesn't work too listener.on("error", (err) -> #do something ) #this works, but it caughts all errors in process, I want only in listener process.on('uncaughtException', (err) -> #do something ) listener.listen(80) #for example 80 to get error 

有任何想法吗?

       

网上收集的解决方案 "Node.js Express应用程序处理启动错误"

首先,expressJS不会抛出uncaughtException事件,过程是这样的,所以你的代码不起作用并不奇怪。

所以使用: process.on('uncaughtException',handler)来代替。

接下来,expressJS已经提供了一个标准的error handling方法,即使用它为此提供的中间件function,如下所示:

 app.configure(function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); 

这个函数返回一个错误消息给客户端,带有可选的堆栈跟踪 ,并logging在connectJS errorHandler中 。

(请注意,errorHandler实际上是connectJS的一部分,仅由expressJS公开。)

如果现有的errorHandler提供的行为不足以满足您的需求,则其源代码位于connectJS的errorHandler中间件中,并且可以轻松进行修改以满足您的需求。

当然,直接修改这个函数并不是直接修改这个函数,而是使用connectJS版本作为起点创build自己的errorHandler,如下所示:

 var myErrorHandler = function(err, req, res, next){ ... // note, using the typical middleware pattern, we'd call next() here, but // since this handler is a "provider", ie it terminates the request, we // do not. }; 

并将其安装到expressJS中:

 app.configure(function(){ app.use(myErrorHandler); }); 

请参阅只是连接它,已经为connectJS的filterprovider中间件的想法的解释,以及如何编写Connect / Express的中间件一个精心编写的教程。

这些对你也可能有用:

  • 如何处理node.js中的代码exception?

  • 从Node.JS中的未捕获exception中恢复

最后,关于testingexpressJS的一个很好的信息来源可以在它自己的testing中find。

这应该做的伎俩:

 listener.listen(80).on('error', function(err) { }); 

listener.listen实际上做的是创build一个HTTP服务器,并调用监听:

 app.listen = function(){ var server = http.createServer(this); return server.listen.apply(server, arguments); };