项目配置
- 默认端口为3000
1 | 项目初始化 |
.env/dotenv配置文件支持
1 | npm i --save @nestjs/config |
Module模块
- 模块用于组织应用程序结构,用于创建controller和provider关系的
1 | @Global() // 一般不需要这个装饰器,除非要让一个模块变成全局模块,其他地方随时能使用,这个一般作用于helpers模块,这样其他模块想用就用,而不用在其他模块一个一个imports了 |
Provider提供者
- 例如service、repository、factory、helper等,都可以用来注入
资源Resource
- restful里面常用的概念
- 使用
nest g resource
能够直接生成一个资源对应的文件Module、Controller等,当然数据库model不会自动生成
Dto
- 用于前后端交互数据类型的定义,可以这样子将entity(model)转换为dto
1 | class MyDto { |
Entity
- 我们的model可以作为entity来用,以
*.entity.ts
结尾
路由与控制器
- 可以使用
nest g controller
生成控制器,不过最好还是用nest g resource
生成一个资源,包含了一些其他的逻辑文件
1 | @Controller() // 表示这是一个控制器 |
异常
1 | 常见异常,默认返回的是{"statusCode": 422, "error": "Unprocessable Entity"}格式 |
数据库
NestJs +Sequelize
安装:
1
2npm install --save @nestjs/sequelize sequelize sequelize-typescript mysql2
npm install --save-dev @types/sequelizeMigration: 由于migration和代码无关,也无需依赖注入,可以直接用sequelize-cli命令来创建维护即可,参考Sequelize 使用手册
配置,具体的数据表定义和用法可以参考sequelize-typescript文档以及我写的Sequelize 使用手册
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49// app.module.ts的imports中进行引入
@Module({
imports: [
SequelizeModule.forRoot({
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
loggin: false, // 是否打印mysql的日志
models: [],
}),
forwardRef(() => AbcModule), // 如果两个module之间互相依赖,可以使用forwardRef来解决循环依赖的问题, can't resolve dependencies of the ...
],
})
// 通过nest g resource User来生成资源文件夹,然后在其目录下新建model文件,例如user.model.ts
import { Column, CreatedAt, Model, Table, UpdatedAt } from 'sequelize-typescript'
@Table({ tableName: 'users' })
export class UserModel extends Model {
@Column
username: string;
@CreatedAt
@Column({ field: 'created_at' })
createdAt: Date;
}
// 定义完成后需要在users.module.ts中引入该model
@Module({
imports: [
SequelizeModule.forFeature([UserModel])
],
controllers: [UsersController],
providers: [UsersService],
exports: [SequelizeModule]
})
export class UsersModule {}
// 然后就能在service注入了
@Injectable()
export class UsersService {
constructor (
@InjectModel(UserModel)
private readonly userModel: typeof UserModel
) {}
}
JWT认证Authentication
需要注意文档里的Enable authentication globally配置是全局的配置,我们一般不会需要这样做,因为登录注册等接口是不需要token的
在控制器获取jwt token的payload,可以这样做
1
2
3
4
5
6async getInfo(@Request() req: any) {
console.log(req.user);
return {
...req.user
};
}
开启CORS
1 | const app = await NestFactory.create(AppModule, { cors: true }); |
OpenAPI/Swagger文档
- 官方文档: 按照官方文档安装以来,然后直接替换main.ts即可
1 | export class UserController { |
常用扩展
nestjs-command
- 可用于编写命令行工具或者写一个daemon进程都可以,集成非常方便,直接复制文档中的例子即可
扩展文章
TroubleShooting
- 测试的时候报错Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test. 其他方法我试过不行,只能在
package.json
的jest
下添加"testTimeout": 60000