使用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}}
答案 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()
,可能允许以后的中间件记录或压缩其数据。