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');
为何错误处理中间件没有拦截错误,直接报错: 小白一枚,求解。
要放在后面
来自酷炫的 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
connect 是流水式处理,挂载的顺序决定各个中间件被调用的顺序。如果错误处理放在前面,先被调用了,当然就得不到后面的错误信息了。
感谢各位回答,是的,我理解错了,我一直以为,只有使用app.use()方法,才叫使用中间件。原来app.get()也是一种处理GET请求的中间件,而按照官网的说法,只要把错误处理中间件放在请求处理的后面即可。但这应该不是编译错误,因为已经进入运行时状态了。不知道我理解得对不对,总之谢谢各位。
然而,导致我犯错的原因是本人正在学习机械工业出版社的Node.js权威指南。本书上的例子都是使用express 3.x,里面的例子却不需要调整位置。是不是express4 做了机制上的调整。我一直在用express3修改该书上的例子。希望有其他学习这边书的朋友可以注意到。