如何通过NestJS应用程序提供2个SPA

时间:2019-07-02 14:03:59

标签: nestjs

我在NestJS应用中使用app.useStaticAssets(ui);来存储我的SPA。该应用程序在信息亭模式下的浏览器上运行。

新的信息亭硬件有2个屏幕,正面,背面。如果我们可以创建另一个SPA并在同一NestJS应用上提供服务,那将是最简单的。

我查看了NestJS文档,试图检查源代码并搜索相关问题,使用res.sendFile(不确定资产)或在NestJS下使用express只能找到提示。

有没有办法直接在NestJS中执行此操作?

2 个答案:

答案 0 :(得分:0)

如果您将Express用作HTTP适配器,则始终可以设置多个静态资产并为其使用不同的前缀

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useStaticAssets(join(__dirname, '..', 'public'));
  app.useStaticAssets( join(__dirname, '..', 'other'), {prefix: '/other/'});
  await app.listen(3000);
}
bootstrap();

在这种情况下,如果有人导航到localhost:3000,他们将得到index.html文件夹的public,但是如果他们导航到localhost:3000/other,他们将得到{{1 }} {文件夹中。

Check more out here

答案 1 :(得分:0)

当尝试使用 Jay 的回答中的代码时,它对我来说根本不起作用,因为当直接通过服务器访问时,我的 Angular 应用程序中的路由 404'd。这是因为内置的 useStaticAssets() 函数只提供它可以在给定目录中找到的文件,而不是你的 Angular 或 React 路由。

我强烈建议您查看 @nestjs/serve-static,因为它允许您像这样提供多个 SPA:

import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join as joinPath } from 'path';

@Module({
    imports: [
        ServeStaticModule.forRoot(
            {
                rootPath: joinPath(__dirname, '..', 'client-admin'),
                serveRoot: '/admin'
            },
            {
                rootPath: joinPath(__dirname, '..', 'client'),
            }
        )

    ]
})
export class AppModule {}

但是,在您使这项工作生效之前,您需要确保您的 SPA 配置为正确安装在这些 URL 上,否则资源(CSS/JS/等)将只是 404。例如,如果您将您的管理应用程序安装到 /admin/,那么您的 index.html 中的所有资源文件 URL 也必须以 /admin/ 为前缀。