GithubHelp home page GithubHelp logo

Comments (18)

raphaelsoul avatar raphaelsoul commented on April 25, 2024 12

Is it possible to disable index fallback to avoid this exception?

ServeStaticModule.forRoot({
      rootPath: path.join(__dirname, '../../../public'),
      serveStaticOptions: {
        index: false,
      },
    }),
[2021-03-25T10:35:11.080] [INFO] NestApplication - Nest application successfully started
[2021-03-25T10:35:13.787] [ERROR] ExceptionsHandler - ENOENT: no such file or directory, stat '/Users/raphaelsoul/projects/zuma/nodejs/mock-server/public/index.html' Error: ENOENT: no such file or directory, stat '/Users/raphaelsoul/projects/zuma/nodejs/mock-server/public/index.html'
[2021-03-25T10:35:13.788] [ERROR] ExceptionsHandler - ENOENT: no such file or directory, stat '/Users/raphaelsoul/projects/zuma/nodejs/mock-server/public/index.html' Error: ENOENT: no such file or directory, stat '/Users/raphaelsoul/projects/zuma/nodejs/mock-server/public/index.html'

from serve-static.

raphaelsoul avatar raphaelsoul commented on April 25, 2024 10

if (options.serveRoot) {
app.use(
options.serveRoot,
express.static(clientPath, options.serveStaticOptions)
);
const renderPath =
typeof options.serveRoot === 'string'
? options.serveRoot + validatePath(options.renderPath as string)
: options.serveRoot;
app.get(renderPath, renderFn);
} else {
app.use(express.static(clientPath, options.serveStaticOptions));
app.get(options.renderPath, renderFn);
}
});

res.sendFile in renderFn causes no such file error.

I think it is the best practice. we dont need a global exeception filter

ServeStaticModule.forRoot({
      rootPath: resolve(__dirname, '../public'),
      serveRoot: '/',
}),

For SPAs it is never a problem cause you will always have an index.html(or using index 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.πŸ˜†

ServeStaticModule.forRoot({
      rootPath: resolve(__dirname, '../skins/material-design/assets'),
      serveRoot: '/themes/material-design',
})

code below does not throw exceptions to built-in ExceptionsHandler class

ServeStaticModule.forRoot({
      rootPath: resolve(__dirname, '../skins/material-design/assets'),
      serveRoot: '/themes/material-design/', // NOTE: it end with slash `/`
})

you can check the reason here(for express)
image

every request url start serveRoot will be handled by express static middleware in line38 in the screenshot instead of renderFn function

It is very tricky. Seems we need robust code in @nestjs/serve-static library

from serve-static.

cyrilselasi avatar cyrilselasi commented on April 25, 2024 7

@kamilmysliwiec Run into the same issue. Was able to catch the error and handle it appropriately here:

@Catch()
export class ServeStaticExceptionFilter implements ExceptionFilter {

  catch( exception: any, host: ArgumentsHost ): any {

    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;

    if ( exception.code === "ENOENT" ) ) {
      response.sendStatus( HttpStatus.NOT_FOUND );

    }
    response.sendStatus( status );

    }
}

Main gotcha for me was the Catch decorator, since the error thrown is not an HttpException, be sure to leave catch everything.

from serve-static.

danielkbx avatar danielkbx commented on April 25, 2024 3

Just ran into the same issue. Even if an exception filter would be working, I think, a 404 would be the correct HTTP response code.

from serve-static.

micaelmbagira avatar micaelmbagira commented on April 25, 2024 1

@kamilmysliwiec @tristan957 here is a repo that reproduces the issue https://github.com/micaelmbagira/nestjs-service-static-139.

from serve-static.

kamilmysliwiec avatar kamilmysliwiec commented on April 25, 2024

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.

Have you tried creating a global exception filter?

from serve-static.

tristan957 avatar tristan957 commented on April 25, 2024

Yes. Sorry if that was not clear from the original issue. My exception filter aimed at catching these 500 errors in order to convert them to 404s.

The global exception filter does not get hit. I know this because my log statements did not come across the console. I can confirm that an instance of the exception filter was created, just not used. To create the global exception filter, I added a provider to my module using the documentation specified at docs.nestjs.com.

from serve-static.

kamilmysliwiec avatar kamilmysliwiec commented on April 25, 2024

Please, provide a minimal repository which reproduces your issue.

from serve-static.

tristan957 avatar tristan957 commented on April 25, 2024

I'll see about getting a reproducible repo tonight.

from serve-static.

tristan957 avatar tristan957 commented on April 25, 2024

@cyrilselasi have you found a good way to use the filter only on the route where you are serving static content?

from serve-static.

cyrilselasi avatar cyrilselasi commented on April 25, 2024

Not yet, I have it set as a global filter at the moment. That's working fine for my case

from serve-static.

cedx avatar cedx commented on April 25, 2024

Same issue here. Returning a 404 status code instead of catching the error 500 with a global exception filter is definitely the best option.

from serve-static.

kamilmysliwiec avatar kamilmysliwiec commented on April 25, 2024

PRs are more than welcome (if anyone is interested) :)

from serve-static.

tristan957 avatar tristan957 commented on April 25, 2024

@kamilmysliwiec I think maybe all I will try later today. Does not seem too hard to add at least (if I understand the code correctly) for the Express side of things which I use.

from serve-static.

gdiasbruno avatar gdiasbruno commented on April 25, 2024

index fallback

I have same issue

from serve-static.

micalevisk avatar micalevisk commented on April 25, 2024

Is it possible to disable index fallback to avoid this exception?

@raphaelsoul I don't think so due to the following:

const indexFilePath = this.getIndexFilePath(clientPath);

public getIndexFilePath(clientPath: string): string {
return join(clientPath, 'index.html');
}

from serve-static.

basz avatar basz commented on April 25, 2024

A other use case I have have is serving a static SPA where we need to inject data into the index.html. It needs to be routed through a controller.

Currently i can have a controller that handles /index.html but /some-other-route would serve the index.html unparsed.

from serve-static.

Lokkve0126 avatar Lokkve0126 commented on April 25, 2024

It is possible to use async await in nestjs fastify to solve this problem

app.get(renderPath, async (req, res) => {
                    await new Promise((resolve, reject) => {
                        const stream = fs.createReadStream(indexFilePath);
                        stream.on("data", (chunk) => {
                            res.type('text/html').send(chunk);
                            resolve();
                        });
                        stream.on("error", () => {
                            reject(new NotFoundException()))
                        });
                    });
                });

from serve-static.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.