Express 框架
Express
框架是基于Node.js
的Web框架,由于js的特殊性,Express还在使用Promise
或者原生callback
。
因为Node.js的众多优秀特性例如单线程,异步,事件驱动,使得Express框架异常轻量高效。
问题出现
现在ES6
使用async
和await
来方便的执行异步语句,使用try{}catch(e){}
来捕捉错误,而Express还在使用Promise
或者原生callback
执行异步操作。这样混合会造成很多隐患。
对于Express框架而言,未捕捉到的错误会直接卡死整个Node进程,造成拒绝服务,不能正确的抛出500错误。
由于Node.js的特殊性,单线程卡死等于整个Node进程死了。更加蛋疼的是,由于Promise,没有catch的会卡在事件循环中,不会正常停止,而会一直拒绝服务。
问题解决
Mark一下解决方法,这里是路由层的代码。
// handle uncaughtExpection
const Layer = require('express/lib/router/layer');
Object.defineProperty(Layer.prototype, 'handle', {
enumerable: true,
get() {
return this.__handle;
},
set(fn) {
if (fn.length === 4) {
this.__handle = fn;
} else {
this.__handle = (req, res, next) =>
Promise.resolve(fn(req, res, next)).catch(next);
}
},
});
将这段代码加在任意一个路由文件中即可正常的抛出500错误了。