我用来express.static提供静态文件,如下所示:
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p));
});
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但是当请求不存在的文件时,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');
});
Run Code Online (Sandbox Code Playgroud)
这意味着文件 404 错误(例如图像文件)正在向客户端返回完整的错误文档 (26kb),这似乎是一个坏主意。
有什么方法可以发现express.static 导致了错误吗?
我想过做类似的事情:
if (req.path.indexOf("/images") === 0){
res.send('Not found');
} else {
res.render('views/error');
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找类似的东西:
if (req.errorFromStatic){
res.send('Not found');
} else {
res.render('views/error');
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到这一点吗?
请参阅文档以了解快速静态
有一个fallthrough选项将调用next()不存在的文件,以便到达错误处理程序块。
app.use("/public", express.static("/static", {fallthrough: false}));
Run Code Online (Sandbox Code Playgroud)
在你的情况下
['/images','/packages','/scripts','/stylesheets'].forEach(p => {
app.use(p, express.static(siteSettings.publicFolder + p, {fallthrough: false}));
});
Run Code Online (Sandbox Code Playgroud)
另外编写一个自己的中间件。将其放在错误处理程序之上:
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();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3020 次 |
| 最近记录: |