NestJs-项目创建

NestJs

Nest.js 用于构建高效且可伸缩的服务端应用程序的渐进式 Node.js 框架。

项目创建

构建工具

  1. 可以使用 npm、yarn、pnpm进行包管理,但议使用pnpm
  2. 建议安装nrm镜像源管理工具,可以方便切换国内镜像,提高下载速度
  3. 建议安装nvm用于切换node版本

全局安装

首先全局安装相关命令,可以使用npm 、yarm、pnpm管理包

pnpm add -g @nestjs/cli nodemon ts-node
nest new project-name

项目依赖

进入项目目录然后安装项目依赖,包含数据库管理、表单验证、加密工具、JWT、文件上传、工具包、日期处理等

pnpm add prisma-binding @prisma/client mockjs @nestjs/config class-validator class-transformer argon2 @nestjs/passport passport passport-local @nestjs/jwt passport-jwt lodash multer dayjs express redis @nestjs/throttler

pnpm add -D prisma typescript @types/node @types/mockjs @nestjs/mapped-types @types/passport-local @types/passport-jwt @types/express @types/lodash @types/multer @types/node

vsCode相关

安装以下插件为NestJs提供支持

 1. Prisma
 2. JavaScript and TypeScript Nightly
 3. DotENV

prettierrc

NestJs项目创建后会生成.prettierrc文件,这是代码格式化规范

{
  "arrowParens": "always",
  "bracketSameLine": true,
  "bracketSpacing": true,
  "embeddedLanguageFormatting": "auto",
  "htmlWhitespaceSensitivity": "css",
  "insertPragma": false,
  "jsxSingleQuote": false,
  "printWidth": 120,
  "proseWrap": "never",
  "quoteProps": "as-needed",
  "requirePragma": false,
  "semi": false,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "all",
  "useTabs": false,
  "vueIndentScriptAndStyle": false,
  "singleAttributePerLine": false
}

依赖注入

依赖注入指创建对象的过程由框架自动完成,a对象在使用b对象,b对象使用c对象,a对象只需要对象,而不需要了解b对象怎么怎么样创建出c对象。

高耦合代码

以下代码是没有依赖注入的情况,a对象要考虑b对象的参数,如果c对象也有参数也要考虑,这显然是高耦合低效率的编码体验。

class c {
  run() {
    console.log('c object');
  }
}

class b {
  constructor(private c) {}
  run() {
    this.c.run();
  }
}

class a {
  constructor(private b) {}

  run() {
    this.b.run();
  }
}

const o = new a(new b(new c()));
o.run();

依赖注入

NestJs将类定义在模块的 providers 属性中即声明为提供者,其他类可以在constructor构造函数中依赖注入,实现编码的解耦。

下面代码的构造函数使用依赖注入了PrismaService与JwtService服务实例。

@Injectable()
export class AuthService {
  constructor(private readonly prismaService: PrismaService, private readonly jwtService: JwtService) {}

  async login(loginDto: LoginDto) {
    const user = await this.prismaService.user.findUnique({
      where: {
        name: loginDto.name,
      },
    })

    const passwordCheck = await argon2.verify(user.password, loginDto.password)
    if (!passwordCheck) throw new BadRequestException('密码输入错误')

    return this.token(user)
  }
  ...
}

生命周期

nextjs生命周期
一般来说,nest.js请求生命周期大致如下:

1.收到请求
2.全局绑定的中间件
3.模块绑定的中间件
4.全局守卫
5.控制层守卫
6.路由守卫
7.全局拦截器(控制器之前)
8.控制器层拦截器 (控制器之前)
9.路由拦截器 (控制器之前)
10.全局管道
11.控制器管道
12.路由管道
13.路由参数管道
14.控制器(方法处理器) (15.服务如果有)
15.路由拦截器(请求之后)
16.控制器拦截器 (请求之后)
17.全局拦截器 (请求之后)
18.异常过滤器 (路由,之后是控制器,之后是全局)
19.服务器响应

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值