nestjs笔记

命令创建项目结构

module、controller、service创建

--no-spec不创建测试用例

1
2
3
nest g mo user
nest g controller user
nest g service user --no-spec

typeorm-model-generator

数据库表自动生成实体类

package.json的scripts配置数据库生成实体类命令:

1
"db": "rm -rf src/entities & npx typeorm-model-generator -h localhost -d race -p 3306 -u root -x hong -e mysql -o src/entities --noConfig --relationIds --lazy --ce none --cp none"

npx typeorm-model-generator –help 查看帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14

-h dbhost
-d dbname
-p port
-u username
-x password
-e dbtype

-a 生成实体类 extends BaseEntity 可使用基础的CURD
-o 默认输出项目根目录下 output 文件夹下 可以自定义输出目标目录,例:-o ./src/demo/entities
--cf,将文件名转换为指定的大小写 [可选值:"pascal","camel","none"] [默认值 none"]
--ce pascal 生成实体类名采用人名式格式 [可选值:"pascal","camel","none"] [默认值 none"]
--cp camel 生成实体类属性采用驼峰 [可选值:"pascal","camel","none"] [默认值 none”]
--noConfig 不产生相关配置文件

使用方法:
1、将数据库所有表转成实体类

1
npm run db

2.单独将数据库的sys_user表生成实体类

1
npm run db -- --tables sys_user,sys_role

装饰器

装饰器 介绍
@Req() 获取Request对象(express)
@Res() 获取Response对象(express)
@Session() 获取req.session
@Param(key?: string) req.params / req.params[key],param是路由中的参数
@Body(key?: string) req.body / req.body[key]
@Query(key?: string) req.query / req.query[key],query是?后的参数
@Headers(name?: string) req.headers / req.headers[name]
@HttpCode(201) 指定response中的返回值

Modules

属性 介绍
providers 被Nest injector实例化的providers
controllers 被Nest injector实例化的controllers
imports 引入这些moludes export 的providers
exports providers的子集,被其他模块可以import

请求生命周期

周期 xm1jf3

顺序:

  • 中间件
  • 卫兵
  • 拦截器(在操纵流之前)
  • 管道
  • 服务端路由函数
  • 拦截器(在操纵流之后)
  • 异常过滤器(如果捕获到任何异常)

中间件

请求生命周期的第一个流程是经过中间件,我们来实现一个日志中间件

如何实现

中间件必须实现NestMiddleware

./common/middleware/logger.middleware.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
const logFormat = ` >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Request original url: ${req.originalUrl}
Method: ${req.method}
IP: ${req.ip}
Status code: ${res.statusCode}
Parmas: ${JSON.stringify(req.params)}
Query: ${JSON.stringify(req.query)}
Body: ${JSON.stringify(req.body)} \n >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
`
console.log(logFormat);
next();
}
}

如何注册中间件

  • 全局中间件
    在main.ts中进行全局注册
1
2
import { LoggerMiddleware } from './common/middleware/logger.middleware'
app.use(new LoggerMiddleware().use)