NodeJs/Express处理缺失的静态文件

9
我有一个Node应用程序,它通过以下方式配置为提供静态文件: app.use(express.static(path.join(__dirname, '../public'))); 同时,在其他路由中我使用了一些认证中间件。当我访问服务器上不存在的图片时,问题出现了。在这种情况下,似乎Express会尝试将该请求通过我为非静态内容编写的所有中间件进行处理。 是否有一种方法仅为丢失的静态资源发送404,而不是针对每个丢失的文件重新触发所有中间件呢?
1个回答

15
express.static()中间件的默认工作方式是在目标目录中查找文件,如果没有找到,则将其传递给下一个中间件。但是,它有一个fallthrough选项,如果将其设置为false,则会立即404任何应该在静态目录中的缺失文件。
来自express.static()文档
当这个选项为true时,客户端错误(例如坏请求或对不存在文件的请求)将导致该中间件简单地调用next()以调用堆栈中的下一个中间件。当为false时,这些错误(甚至404响应)将调用next(err)。
将此选项设置为true,以便您可以将多个物理目录映射到同一Web地址,或者用于填充不存在的文件的路由。
如果您已将此中间件挂载到专门设计为严格单个文件系统目录的路径,请使用false,这样可以减少开销并使404响应快速失败。该中间件还将回复所有方法。
示例:
app.use("/public", express.static("/static", {fallthrough: false}));

谢谢。运行得非常好。我还要补充一点,这是“serve-static”模块的一个较新功能。我当时用的是“Express 4.2.0”,该版本附带的“serve-static”没有此功能。所以需要更新。 - Max
@Max - 我没有意识到这只是一个相对较新的功能 - 很好知道。Express文档通常不会标识添加了哪个版本的功能。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接