che*_*r89 7 error-handling node.js express
我正在使用Express构建一个示例网站,我点击了一些我不太了解的内容.
如果我理解正确的话,错误处理中间件应该是管道中的最后一个(s).例如,工作正常:
var http = require('http');
var express = require('express');
var app = express();
app.set('view engine', 'jade');
app.set('views', './views');
app.use(express.static('./public'));
http.createServer(app).listen(portNumber, function() { });
app.get('/hello', function(req, res) {
res.send('Welcome!');
});
app.use(function(err, req, res, next) {
res.status(500).send('something broke!');
});
app.get('/error', function(req, res, next) {
somethingNonExistent(2016);
});
Run Code Online (Sandbox Code Playgroud)
但是,如果我在http.createServer调用之前注册该中间件,但是在注册了所有其他中间件之后,它将无法工作 - 我的代码未被调用:
var http = require('http');
var express = require('express');
var app = express();
app.use(express.static('./public'));
app.use(function(err, req, res, next) {
res.status(500).send('something broke!');
});
http.createServer(app).listen(portNumber, function() { });
app.get('/hello', function(req, res) {
res.send('Welcome!');
});
app.get('/error', function(req, res, next) {
somethingNonExistent(2016);
});
Run Code Online (Sandbox Code Playgroud)
我在这里想念的是什么?我的猜测是app.get调用内部使用一些中间件,它搞砸了.
我使用Express 3.2.6和Node.js 0.10.29,如果这有任何区别
当您定义路由/中间件时,path您指定的用于查看它是否与传入请求匹配。您的请求将始终被路由到第一场比赛。一个请求可能有多个匹配项,因此这里的顺序很重要。您可以通过调用该函数来命中下一个匹配的路由/中间件next()。
当您在不指定路径的情况下挂载中间件时app.use,每个路径都有资格访问该中间件。因此,如果它是您安装的第一个东西,则每个请求都将使用该中间件。
如果你想要一个捕获所有错误处理程序,你会想要相反的 - 你应该在路由定义的最后安装中间件。您需要next在处理程序中调用该函数才能实际到达此中间件:
app.get('/hello', function(req, res, next) {
...
// Let's pretend that there was some error
next()
});
// After all of your route definitions...
app.use(function(req, res) {
res.status(500).send('something broke!');
})
Run Code Online (Sandbox Code Playgroud)
请注意,如果当前路径不存在路由,您还将点击此捕获所有中间件。
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |