开发中遇到的那些nestjs相关问题

前言

最近在开发nestjs项目,遇到了一些问题,记录一下。

Nest 静态文件服务

虽然并没有使用nestjs的静态文件服务作为默认的静态资源地址,但还是可以当作备用方案。很久前就遇到了这个问题,只是看官方的issue和网上的一些blog也没有解决就先放到了一边开发其他功能去了,今天想起来了,解决一下。

根据官方文档,Nest 静态文件服务需要在项目根目录下创建一个 public 文件夹,然后将静态文件放到这个文件夹下。

文件路径为:

1
2
3
4
5
6
7
8
9
10
11
12
13
.
├── package.json
├── public
│   └── foo.png
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── main.ts
├── tsconfig.build.json
├── tsconfig.json
└── yarn.lock

根据官网示例配置一下import,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';

@Module({
imports: [
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', 'public'),
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

但当打开url http://localhost:3000/public/foo.png 时,浏览器和日志都提示 ENOENT: no such file or directory, stat xxxx/index.html

解决方案:

1
2
3
4
5
6
imports: [ 
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', '../public'),
serveRoot: '/public/'
}),
],

这样就可以通过 http://localhost:3000/public/foo.png 访问静态文件了。

typeerror do not know how to serialize a bigint nestjs

有时会使用bigint类型的数据,而默认的序列化器不支持bigint,需要使用json-bigint模块来序列化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// bigint.interceptor.ts
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import JSONBig from 'json-bigint';

@Injectable()
export class BigintInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map(data => {
return JSONBig.parse(JSONBig.stringify(data));
}),
);
}
}

// some.controller.ts
@UseInterceptors(new BigintInterceptor())
export class SomeController {
}