我的错误处理程序如何优先于早期的中间件

时间:2014-12-01 12:52:47

标签: javascript node.js express

使用express.js进行项目,第一次使用它不仅仅是为了搞乱,而且在让中间件玩得很好的时候遇到一些麻烦。

我的问题是调用我的快速静态路由,声明接近文件顶部

app.use(express.static(__dirname + '/public'));

实际上是由错误处理程序处理的,几乎位于文件的底部

app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

......我不确定为什么。我知道JS并不一定按顺序执行,但我的理解是express将按顺序执行这些,并且app.use底部的app.use内容将在next();之后发生在顶部 - 因此是否需要app.use - 传递给下一个// Initial variable setup var express = require('express'), favicon = require('serve-favicon'), logger = require('morgan'), cookieParser = require('cookie-parser'), bodyParser = require('body-parser'), swig = require('swig'), stylus = require('stylus'), nib = require('nib'), fs = require('fs'), app = express() ; app.use(express.static(__dirname + '/public')); app.engine('html', swig.renderFile); app.set('view engine', 'html'); (settings.deploymentMode === 'dev') && app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); function compile(str, path) { console.log('STYLUS: Compiling CSS'); return stylus(str) .set('filename', path) .set('compress', true) .use(nib()) .import('nib'); } app.use(stylus.middleware( { src: __dirname + '/public', compile: compile } )); // Got some routing going on here... app.get statements, all working fine. // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('system/error', { message: err.message, error: err }); }); } else { // Production error handler - @TODO: Rewrite this one first. app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('system/error', { message: err.message, error: {} }); }); } module.exports = app; 处理程序?

任何想法/智慧?任何帮助表示赞赏。

我有这段代码:

{{1}}

1 个答案:

答案 0 :(得分:1)

快速错误处理中间件使用四个参数定义,而不是三个。

// From the specs
app.use(function(err, req, res, next){
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

如果你只用3个参数定义它,那么它认为它是一个“正常”的中间件,除非是以前的中间件,否则会调用它,而不是调用next()来结束请求。似乎静态中间件调用next(),可能允许以后的中间件记录或压缩其数据。