为何错误处理中间件没有拦截error,小白一枚,求解。
发布于 9 年前 作者 fatbone008 4350 次浏览 最后一次编辑是 8 年前 来自 问答

var express=require('express');
var app=express();
app.route('/');
app.use(function(err, req, res, next){
    res.send(200,'出错了:'+err.message);
});
app.get('/',function(req,res){
    noneexists();   //不存在的方法
    res.send('你好');
});
app.listen(1337,'127.0.0.1');

为何错误处理中间件没有拦截错误,直接报错: 屏幕快照 2016-03-20 11.48.14.png 小白一枚,求解。

9 回复

要放在后面

来自酷炫的 CNodeMD

没有定义错误监听函数吧

@ncuzp app.use(function(err,req,res,next){}不是说自定义中间件只要有四个参数,就是自动处理错误的方式吗?还需要如何监听?

@klesh 什么要放在后面?

你这个属于“编译错误”,程序都无法执行,自然不会catch到执行时错误了。

@kolyjjj 程序启动时没有报错,是在浏览器发出请求后返回的堆栈信息。 即使,将

 noneexists();   //不存在的方法

改为 throw new Error('一个错误'); 结果还是一样,没有处理这个error。

①noneexists();编译错误 ②错误处理函数要放在后面兜底 参见官方文档http://expressjs.com/en/guide/error-handling.html 2016-03-20 15-29-37屏幕截图.png

connect 是流水式处理,挂载的顺序决定各个中间件被调用的顺序。如果错误处理放在前面,先被调用了,当然就得不到后面的错误信息了。

感谢各位回答,是的,我理解错了,我一直以为,只有使用app.use()方法,才叫使用中间件。原来app.get()也是一种处理GET请求的中间件,而按照官网的说法,只要把错误处理中间件放在请求处理的后面即可。但这应该不是编译错误,因为已经进入运行时状态了。不知道我理解得对不对,总之谢谢各位。

然而,导致我犯错的原因是本人正在学习机械工业出版社的Node.js权威指南。本书上的例子都是使用express 3.x,里面的例子却不需要调整位置。是不是express4 做了机制上的调整。我一直在用express3修改该书上的例子。希望有其他学习这边书的朋友可以注意到。

回到顶部