如何从express.static检测404错误

ben*_*ear 5 node.js express

我用来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)

有什么办法可以做到这一点吗?

kmg*_*mgt 1

请参阅文档以了解快速静态

有一个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)