如何从express.static中检测404错误
我正在使用express.static
提供静态文件,如下所示:
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p));
});
这很好用,但是当请求一个不存在的文件时,express会如预期的那样引发错误,但这正在打我的自定义错误捕获所有路由:
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'production' ? {} : err;
// render the error page
res.status(err.status || 500);
res.render('views/error');
});
这意味着文件404错误(例如,图像文件)正在将完整的错误文档返回给客户端(26kb),这似乎是个坏主意。
有没有一种方法可以使express.static引起错误?
我考虑过做类似的事情:
if (req.path.indexOf("/images") === 0){
res.send('Not found');
} else {
res.render('views/error');
}
但是我正在寻找类似的东西:
if (req.errorFromStatic){
res.send('Not found');
} else {
res.render('views/error');
}
有什么办法吗?
回答如下:请参见docs for express static
有一个fallthrough
选项将为不存在的文件调用next()
,因此将到达您的错误处理程序块。
app.use("/public", express.static("/static", {fallthrough: false}));
根据您的情况
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p, {fallthrough: false}));
});
另外编写自己的中间件。将其放在错误处理程序上方:
var fs = require('fs');
app.use(function (req, res, next) {
if(['/images', '/packages', '/scripts', '/stylesheets'].includes(req.path)) {
if (!fs.existsSync(path.join(__dirname, siteSettings.publicFolder, req.originalUrl))) {
res.send('Not found');
}
}
return next();
});
如何从express.static中检测404错误
我正在使用express.static
提供静态文件,如下所示:
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p));
});
这很好用,但是当请求一个不存在的文件时,express会如预期的那样引发错误,但这正在打我的自定义错误捕获所有路由:
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'production' ? {} : err;
// render the error page
res.status(err.status || 500);
res.render('views/error');
});
这意味着文件404错误(例如,图像文件)正在将完整的错误文档返回给客户端(26kb),这似乎是个坏主意。
有没有一种方法可以使express.static引起错误?
我考虑过做类似的事情:
if (req.path.indexOf("/images") === 0){
res.send('Not found');
} else {
res.render('views/error');
}
但是我正在寻找类似的东西:
if (req.errorFromStatic){
res.send('Not found');
} else {
res.render('views/error');
}
有什么办法吗?
回答如下:请参见docs for express static
有一个fallthrough
选项将为不存在的文件调用next()
,因此将到达您的错误处理程序块。
app.use("/public", express.static("/static", {fallthrough: false}));
根据您的情况
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p, {fallthrough: false}));
});
另外编写自己的中间件。将其放在错误处理程序上方:
var fs = require('fs');
app.use(function (req, res, next) {
if(['/images', '/packages', '/scripts', '/stylesheets'].includes(req.path)) {
if (!fs.existsSync(path.join(__dirname, siteSettings.publicFolder, req.originalUrl))) {
res.send('Not found');
}
}
return next();
});