如何捕获express框架app.listen的异常?
发布于 7 年前 作者 lovegnep 5007 次浏览 来自 问答

由于在启动项目时会出现

	uncaught exception: Error: listen EADDRINUSR 155.145.111.11:45621
	...
	...

所以想捕获listen的异常。但在网上查了之后都是用的process.on(‘uncaughtexception’,function)此方法。 有没有直接捕获listen的异常的方法呀,求助。

6 回复

app.listen() 的第二个参数是一个回调,而这个回调的第一个参数是错误

@steambap 不知道你有没有亲手试过,反正我这样试过是不行,捕获不到异常。 下面是我写的测试代码:

	let express = require('express');
	let app = express();
	app.use('/', function(req,res){
		res.write('hehe');
		res.end();
	});
	app.listen(12789, function(err){
		if(err){
		console.log(err); //当打开此程序后,再次打开然而断点断不住此处。
		}
	});

求关注,1楼的方法并不管用。

像这种端口占用的错误,就是要抛出来进程挂掉哇,端口都被占用了,就算你捕获到让进程处理假死状态不退出也没有意义啊

先来点非营养品:

1、process.on(‘uncaughtexception’, callback) 是进程级别的异常捕获; 2、app.listen(port, callback); 这里的 callback 可以理解为,整个框架都是通过一个回调函数来处理 HTTP 请求,里面进程 MVC 等各种设计;

来看看 app.listen 到底做了什么:https://github.com/expressjs/express/blob/master/lib/application.js#L617。

====== 正义分割线

  • 通过 app.listen 我们其实得到一个 server 对象,通过监听 server 对象的错误事件可以获取到错误信息;
server.on('error', (e) => {
  if (e.code === 'EADDRINUSE') {
    console.log('Address in use, retrying...');
    setTimeout(() => {
      server.close();
      server.listen(PORT, HOST);
    }, 1000);
  }
});

- 通过 server.listening 方法可以提前判断端口是否被占用;
- listen 时指定端口为 0 ,会随机分配一个可用的端口;

别问我东西哪来的,看文档~


@x-cold 厉害

来自酷炫的 CNodeMD

回到顶部