【问题标题】:How to define path prefix in ServeStaticModule?如何在 ServeStaticModule 中定义路径前缀?
【发布时间】:2021-03-07 00:03:43
【问题描述】:

我想根据这个文档https://docs.nestjs.com/recipes/serve-static#serve-static 提供一些静态目录结构,但可以找到这些简单问题的答案:

  1. 如何设置像'/some/path/to/files'这样的路径前缀?
  2. 如何设置运行时服务(文件路径是动态的,不能硬编码)?

提前致谢。

附:我看到了一些关于 app.useStaticAssets() 的答案,但据我所知,这是 Express 特定的解决方案,无论如何都不会用最新版本编译 (Property 'useStaticAssets' does not exist on type 'INestApplication')...

更新

例如,我有这些目录:

  1. /var/lib/app/data1
  2. /var/lib/app/data2
  3. /home/user/some/path

我希望它被用作:

  1. http://localhost:3000/path1
  2. http://localhost:3000/path333
  3. http://localhost:3000/my/funny/cats

【问题讨论】:

  • wont compile with latest version anyway 我建议你在一个新线程上问这个问题。如您所见,他们的官方文档中记录了对静态内容的支持。他们甚至包括完整的解决方案,可以毫无问题地构建和运行:github.com/nestjs/nest/tree/master/sample/24-serve-static
  • 根据官方文档,您有两个选择:Under the hood, Nest makes use of robust HTTP Server frameworks like Express (the default) and optionally can be configured to use Fastify as well! docs.nestjs.com 提供静态内容应该适用于任一选项。

标签: nestjs


【解决方案1】:

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

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

这是我使用它的用例:

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

上面的这一行是在你的 app.module 中引入的,基本上我是说位于/media/avatar 的文件应该在localhost:1234/avatar 上提供。

【讨论】:

  • 这如何帮助我为来自不同路径的许多不同文件夹提供服务,其中一些应该在运行时确定?
【解决方案2】:

你问

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

您可以有多个 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 不能做到这一点。其他人应该请纠正我。

【讨论】:

  • 好主意!我不认为我可以使用该模块的多个副本。
  • 使用 fastify 适配器时不起作用。知道我能做些什么吗?
【解决方案3】:

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

【讨论】:

  • 也许我的问题太常见了。我添加了这个例子来说明我想要什么。我应该传递什么ServeStaticModuleOptions 来实现这一目标?
【解决方案4】:

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

ServeStaticModule.forRootAsync({
     imports: [ConfigModule],
     inject: [ConfigService],
     useFactory: (configService: ConfigService) => [
     {
       rootPath: configService.get<string>('rootPath'),
     },
   ],
})

【讨论】:

    【解决方案5】:

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

    @Module({
        imports: [
            ServeStaticModule.forRoot({
                rootPath: join(__dirname, '..', 'static'),
            }),
        ],
    })
    

    在这种情况下,根目录是 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 的文档: https://github.com/nestjs/serve-static/blob/master/lib/interfaces/serve-static-options.interface.ts

    我会将您的注意力指向renderPath。我没有发现renderPath 的文档非常清楚,但在此错误报告中,预期的行为是renderPath 按照您的需要重新映射到 URL 的本地路径:https://github.com/nestjs/serve-static/issues/26

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

    【讨论】:

    • 我看不出这一切如何回答我的问题或解决我提供的示例中的问题。文档或示例中没有任何内容涵盖这种情况。如果我是盲人 - 请提供我应该通过 ServeStaticModuleOptions 传递什么来实现这一目标。
    • 您在询问如何将文件夹 A 映射到带有 url /B 的 HTTP 请求。实际上,您询问了如何将 A 重新映射到 B、C 到 D 等等。我不认为这是可能的。看来renderPath 可以做一个固定的重新映射,A 到 B。在这里,您可以看到实现这一点需要什么:github.com/nestjs/serve-static/issues/26
    • 如果我是你,我会使用子文件夹将文件夹合并为一个,甚至将根文件夹的名称与你想在 URL 中使用的名称相匹配,以使其简单。但是我对您的用例一无所知。
    猜你喜欢
    • 2012-01-31
    • 2014-05-27
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-09-19
    相关资源
    最近更新 更多