Nestjs 如何在ServeStaticModule中定义路径前缀?
我想根据本文档提供一些静态目录结构,但可以找到以下简单问题的答案:Nestjs 如何在ServeStaticModule中定义路径前缀?,nestjs,Nestjs,我想根据本文档提供一些静态目录结构,但可以找到以下简单问题的答案: 如何设置路径前缀,如“/some/path/to/files” 如何在运行时设置服务(文件路径是动态的,不能硬编码) 提前谢谢 另外,我看到了一些关于app.useStaticAssets()的答案,但据我所知,这是特定于Express的解决方案,无论如何都不会使用最新版本编译(属性“useStaticAssets”在类型“INestApplication”上不存在) 更新 例如,我有以下目录: /var/lib/app/dat
app.useStaticAssets()
的答案,但据我所知,这是特定于Express的解决方案,无论如何都不会使用最新版本编译(属性“useStaticAssets”在类型“INestApplication”上不存在
)
更新
例如,我有以下目录:
您可以在
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中使用的名称相匹配,以使其变得简单。但是,我对您的用例一无所知。这如何帮助我从不同的路径提供许多不同的文件夹,其中一些应该在运行时确定?好主意!我不认为我可以使用几个模块的副本来工作。