There is not good way to catch "File not found" errors on static assets
See original GitHub issueI’m submitting a…
[ ] Regression
[ ] Bug report
[x] Feature request
[ ] Documentation issue or request
[ ] Support request => Please do not submit support request here, instead post your question on Stack Overflow.
Current behavior
So if you setup the ServeStaticModule and provide serveStaticOptions: { fallthrough: false }, the module reports a 500 (Internal Server) error.
I don’t know why this is not coming clearly to me, but I want to change the 500 error to a 404, because the file was not found.
I tried to use a global Internal Server filter and match the route in the case of 500 errors, but that wasn’t possible because for some reason the filter doesn’t get hit. I must be missing something higher level about NestJS.
Expected behavior
I expect there to be an ergonomic way to handle errors when fallthrough is set to false.
Minimal reproduction of the problem with instructions
Use the example in the nest repo: https://github.com/nestjs/nest/blob/master/sample/24-serve-static/src/app.module.ts#L8
and configure your ServeStaticModule to also serve your home directory (just an example) include serveStaticOptions: { fallthrough: false }
. Then after you have set up the mount point, start the server and enter a URL under the mount point that would not exist in your home directory. Your browser should report a 500 error.
What is the motivation / use case for changing the behavior?
It currently seems either impossible or not easily discoverable on how a developer can catch the serve-static 500 error and change it to a 404 for when a file is not found.
Environment
Nest version: 7.0.2
Honestly maybe this is an issue for the serve-static repo. I am unsure.
Issue Analytics
- State:
- Created 4 years ago
- Reactions:13
- Comments:16 (4 by maintainers)
Top GitHub Comments
Is it possible to disable index fallback to avoid this exception?
https://github.com/nestjs/serve-static/blob/d0f4a89ca32a7d2315b03a045d7a57bc99f11771/lib/loaders/express.loader.ts#L44-L59
res.sendFile
inrenderFn
causesno such file
error.I think it is the best practice. we dont need a global exeception filter
For SPAs it is never a problem cause you will always have an
index.html
(or usingindex
specify a filename)For serving static file in traditional frontend project, just give a non-empty
serveRoot
.Therefore, it seems there is no need for a PR to fix this, we just need update nestjs docs to declare usage for serving SPAs and non-SPAs@kamilmysliwiec#207 #523
UPDATE:
in some occasions, the solution above(give non empty serveRoot) still not works. For Example, you want to serve
skins/material-design/assets
under/themes/material-design
.😆code below does not throw exceptions to built-in ExceptionsHandler class
you can check the reason here(for express)
every request url start
serveRoot
will be handled by express static middleware in line38 in the screenshot instead ofrenderFn
functionIt is very tricky. Seems we need robust code in @nestjs/serve-static library