当前位置: 首页 > 面试题库 >

如何将所有路由重定向到nest.js中的index.html(角)?

龙令雪
2023-03-14
问题内容

我正在制作Angular + NestJS应用,我想发送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')。请帮忙


问题答案:

您只能使用setBaseViewsDir@Render()与像车把(HBS)视图引擎;
用于提供静态文件(角度),但是,您只能使用useStaticAssetsresponse.sendFile

要使用index.html其他所有路线,您有两种可能:

A)中间件

您可以创建执行重定向的中间件,请参阅本文:

@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
      },
    );
  }
}

B)全局错误过滤器

您可以将所有重定向NotFoundExceptionsindex.html

@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

app.useGlobalFilters(new NotFoundExceptionFilter());


 类似资料:
  • 我有一个Quarkus应用程序,它都包了一个角水疗(捆绑在罐子里)。Quarkus提供后端API路由供前端使用。在构建Quarkus应用程序时,将Angular应用程序构建复制到目标中的路径。 我没有使用JAX-RS来注册路由。相反,我直接在Vertx路由器上的方法中以编程方式注册它们。 我希望任何不被识别的路由(无论是作为Vertx注册的路由还是静态资源)被重新定向到,以便我的Angular应用

  • 问题内容: 我一直在使用Web API在ASP.NET MVC内从事 AngularJS 项目。它非常有用,除非您尝试直接转到有角度的路由URL或刷新页面。我认为可以使用 MVC的路由引擎 来处理服务器配置,而不是胡闹。 当前的WebAPIConfig: 当前的RouteConfig: 当前的Global.asax.cs: 目标: / api / *继续转到WebAPI,/ partials /

  • (以防你看过我的上一个问题:不要混淆问题的第一部分/引言是相同的。最后的问题是不同的:) 我正在使用Symfony 2.8开发一个WebApp项目。我想在页面中添加不同的语言。根据用户的区域设置,所有路由/url应从更改为/locale/some/url

  • 问题内容: 我正在为基于React的单页应用程序开发spring后端,在其中我使用React-Router进行客户端路由。 在index.html页面旁边,后端在路径上提供数据。 为了在我的应用程序的根路径上提供index.html,我添加了一个资源处理程序 我想要的是在没有其他路由匹配时(例如,当我调用以外的路径时)提供index.html页。 在spring如何配置这种全包式路线? 问题答案:

  • 我正在使用S3托管一个javascript应用程序,该应用程序将使用HTML5 pushStates。问题是,如果用户为任何URL添加书签,它将无法解析为任何内容。我需要的是接收所有url请求并在S3桶中提供根index.html的能力,而不是仅仅进行完全重定向。那么我的javascript应用程序就可以解析URL并提供适当的页面。 有没有办法告诉S3为所有URL请求提供index.html服务,