最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

如何从express.static中检测404错误

IT培训 admin 6浏览 0评论

如何从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();
});
发布评论

评论列表 (0)

  1. 暂无评论