Nestjs 如何在ServeStaticModule中定义路径前缀?

Nestjs 如何在ServeStaticModule中定义路径前缀?,nestjs,Nestjs,我想根据本文档提供一些静态目录结构,但可以找到以下简单问题的答案: 如何设置路径前缀,如“/some/path/to/files” 如何在运行时设置服务(文件路径是动态的,不能硬编码) 提前谢谢 另外,我看到了一些关于app.useStaticAssets()的答案,但据我所知,这是特定于Express的解决方案,无论如何都不会使用最新版本编译(属性“useStaticAssets”在类型“INestApplication”上不存在) 更新 例如,我有以下目录: /var/lib/app/dat

我想根据本文档提供一些静态目录结构,但可以找到以下简单问题的答案:

  • 如何设置路径前缀,如“/some/path/to/files”
  • 如何在运行时设置服务(文件路径是动态的,不能硬编码)
  • 提前谢谢

    另外,我看到了一些关于
    app.useStaticAssets()
    的答案,但据我所知,这是特定于Express的解决方案,无论如何都不会使用最新版本编译(
    属性“useStaticAssets”在类型“INestApplication”上不存在

    更新

    例如,我有以下目录:

  • /var/lib/app/data1
  • /var/lib/app/data2
  • /主/用户/部分/路径
  • 我希望它被用作:


  • 您可以在
    ServeStaticModule
    上设置选项。通常路径是
    “*”
    ,因此任何与其他定义的路由不匹配的内容都会尝试通过
    res.sendFile()
    发送。如果要使其成为
    some/path/to/file
    ,可以设置
    renderPath:'some/path/to/files/*
    ,它应该可以工作。

    rootPath
    确定静态内容所在的根目录:

    @Module({
        imports: [
            ServeStaticModule.forRoot({
                rootPath: join(__dirname, '..', 'static'),
            }),
        ],
    })
    
    在这种情况下,根目录是
    静态
    文件夹

    例如,您可以具有以下结构:

    static
        page
          png
            sky.png
          index.html
    
    为了获得sky.png,请求是:
    http://localhost:3000/page/png/sky.png

    为了获取index.html,请求是:
    http://localhost:3001/page/index.html

    此外,以下是有关
    ServeStaticModuleOptions
    的文档:

    请注意
    renderPath
    。我觉得
    renderPath
    的文档不是很清楚,但是在这个bug报告中,预期的行为是
    renderPath
    根据您的需要将本地路径重新映射到URL:


    您还可以查看Express/Fastify,了解该选项是如何处理的,因为这些是封面下使用的服务器

    这是一个老问题,但我遇到了同样的问题

    这是我的,所以在@Jay的答案的帮助下,它提供了上所有可用选项的链接,我能够找到正确的选项,即使用NestJS ServeStaticModule时的
    serveRoot

    下面是我使用它的用例:

    ServeStaticModule.forRoot({rootPath:'/media/avatar',serveRoot:'/avatar})

    上面这一行将包含在导入的app.module中,基本上我是说位于
    /media/avatar
    中的文件应该在您要求的
    localhost:1234/avatar上提供


    这如何帮助我从不同的路径提供许多不同的文件夹,其中一些应该在运行时确定

    您可以有几个ServeRoot声明,如下所示:

    ServeStaticModule.forRoot({
      serveRoot: '/path1',
      rootPath: `/var/lib/app/data1`,
    }),
    ServeStaticModule.forRoot({
      serveRoot: '/path333',
      rootPath: `/var/lib/app/data2`,
    }),
    ServeStaticModule.forRoot({
      serveRoot: '/my/funny/cats',
      rootPath: `/home/user/some/path`,
    }),
    

    至于“在运行时确定”,可能
    ServeStaticModule
    无法做到这一点。其他人应该纠正我的错误。

    如果有人想从配置服务获取静态文件根路径,我们可以这样做

    ServeStaticModule.forRootAsync({
         imports: [ConfigModule],
         inject: [ConfigService],
         useFactory: (configService: ConfigService) => [
         {
           rootPath: configService.get<string>('rootPath'),
         },
       ],
    })
    
    ServeStaticModule.forRootAsync({
    导入:[ConfigModule],
    inject:[ConfigService],
    useFactory:(configService:configService)=>[
    {
    rootPath:configService.get('rootPath'),
    },
    ],
    })
    
    也许我的问题太常见了。我添加了这个例子来说明我想要什么。我应该传递什么
    ServeStaticModuleOptions
    来实现这一点?
    无论如何都不会使用最新版本编译
    我建议您在新线程上问这个问题。正如您所注意到的,对静态内容的支持记录在他们的官方文档中。他们甚至包括了完整的解决方案,该解决方案构建和运行时不会出现任何问题:根据官方文档,您有两个选项:
    在后台,Nest使用了强大的HTTP服务器框架,如Express(默认设置),还可以选择配置为使用Fastify提供静态内容应该与这两个选项一起工作。我不知道这一切如何回答我的问题或解决我提供的示例中的问题。文档或示例中没有任何内容涵盖这种情况。如果我是盲人-请提供我应该传递什么作为
    ServeStaticModuleOptions
    来实现这一点。您正在询问如何使用url将文件夹
    A
    映射到HTTP请求
    /B
    。实际上你问过如何将A映射到B,C映射到D,等等。我认为这是不可能的。看起来,
    renderPath
    可以执行一个固定的重新映射,A到B。在这里,您可以看到实现这一点所需的步骤:如果我是您,我将使用子文件夹将文件夹合并到一个文件夹中,甚至将根文件夹的名称与您希望在URL中使用的名称相匹配,以使其变得简单。但是,我对您的用例一无所知。这如何帮助我从不同的路径提供许多不同的文件夹,其中一些应该在运行时确定?好主意!我不认为我可以使用几个模块的副本来工作。