Nestjs如何获取静态图像

xit*_*tas 1 express typescript nestjs

我一直在阅读和实施很多解决方案,但似乎没有任何效果。

我正在使用 Nestjs ServeStatic 作为他们的官方文档并遵循 StackOverflow 的问题。

但似乎没有任何作用。

到目前为止我的代码

应用程序模块.ts

import { ServeStaticModule } from '@nestjs/serve-static/dist/serve-static.module';
import { join } from 'path';

@Module({
  imports: [ 
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', 'public'),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
Run Code Online (Sandbox Code Playgroud)

我的文件夹结构

/Source
  |-public
  |--img.jpg
  |-src
  |--app.module.ts
  |--app.controller.ts
  |--main.ts
Run Code Online (Sandbox Code Playgroud)

尝试通过访问该文件

http://localhost:3000/public/img.jpg
Run Code Online (Sandbox Code Playgroud)

错误:

[Nest] 3320   - 06/17/2021, 5:24:42 PM   [ExceptionsHandler] ENOENT: no such file or directory, stat 'F:\code\dist\public\index.html' +3898ms
Error: ENOENT: no such file or directory, stat 'F:\code\dist\public\index.html'
Run Code Online (Sandbox Code Playgroud)

我一直在关注的问题

问题1

问题2

医生

xit*_*tas 16

问题是它正在dist文件夹中查找文件。为了解决这个问题,我们必须向上一级,之后,它得到唯一的index.html,因此我们必须添加serveRoot

代码

import { ServeStaticModule } from '@nestjs/serve-static/dist/serve-static.module';
import { join } from 'path';

@Module({
  imports: [ 
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', '../public'), // added ../ to get one folder back
      serveRoot: '/public/' //last slash was important
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它也可以在 rootPath 中没有 ../ 的情况下工作。需要ServeRoot,非常感谢 (3认同)

Hug*_*ohm 5

您可能缺少main.ts.

app.useStaticAssets(join(__dirname, '..', 'public'), {
  prefix: '/public',
});
Run Code Online (Sandbox Code Playgroud)

您不需要ServeStaticModule在您的app.module.ts.

ServeStaticModule.forRoot({
    rootPath: join(__dirname, '..', 'public'),
    // serveRoot: 'public'
}),
Run Code Online (Sandbox Code Playgroud)

您也可以将其从您的main.ts.

app.use(express.static(__dirname + 'public'));
app.use('/', express.static('../public'));
Run Code Online (Sandbox Code Playgroud)