我正在制作Angular + NestJS应用,我想发送index.html所有路线的文件。
index.html
主要
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useStaticAssets(join(__dirname, '..', 'frontend', 'dist', 'my-app')); app.setBaseViewsDir(join(__dirname, '..', 'frontend', 'dist', 'my-app')); await app.listen(port); }
应用控制器
@Controller('*') export class AppController { @Get() @Render('index.html') root() { return {}; } }
打开时它工作正常localhost:3000/,但是如果打开localhost:3000/some_route,服务器随即500 internal error提示Can not find html module。我一直在搜寻为什么我会收到此错误,而所有人都说set default view engine like ejs or pug,但是我不想使用某些引擎,我只想发送由angular构建的纯html,而不会像hack一样res.sendFile('path_to_file')。请帮忙
localhost:3000/
localhost:3000/some_route
500 internal error
Can not find html module
set default view engine like ejs or pug
res.sendFile('path_to_file')
您只能使用setBaseViewsDir并@Render()与像车把(HBS)视图引擎; 用于提供静态文件(角度),但是,您只能使用useStaticAssets和response.sendFile。
setBaseViewsDir
@Render()
useStaticAssets
response.sendFile
要使用index.html其他所有路线,您有两种可能:
您可以创建执行重定向的中间件,请参阅本文:
@Middleware() export class FrontendMiddleware implements NestMiddleware { resolve(...args: any[]): ExpressMiddleware { return (req, res, next) => { res.sendFile(path.resolve('../frontend/dist/my-app/index.html'))); }; } }
然后为所有路由注册中间件:
export class ApplicationModule implements NestModule { configure(consumer: MiddlewaresConsumer): void { consumer.apply(FrontendMiddleware).forRoutes( { path: '/**', // For all routes method: RequestMethod.ALL, // For all methods }, ); } }
您可以将所有重定向NotFoundExceptions到index.html:
NotFoundExceptions
@Catch(NotFoundException) export class NotFoundExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); response.sendFile(path.resolve('../frontend/dist/my-app/index.html'))); } }
然后在您的中将其注册为全局过滤器main.ts:
main.ts
app.useGlobalFilters(new NotFoundExceptionFilter());