nestjs框架搭建

1.通过cli创建nestjs项目

npm i -g @nestjs/cli   //安装脚手架

创建项目

nest new [项目名称]

2.安装cors解决跨域问题

在新版本的Nestjs自带了解决跨域的方法

在main.js文件中使用

app.enableCors()

旧版方法

npm i cors
npm i @types/cors -D

在main.ts文件引入

import * as cors from 'cors'
app.use(cors())

3.常用cli命令

(1).生成controller.ts

nest g co user

(2).生成 module.ts

nest g mo user

(3).生成service.ts

nest g s user

(4).生成CURD

 nest g resource users

4.使用ORM框架连接数据库

框架地址: https://www.npmjs.com/package/typeorm

安装依赖

(1)mysql

npm install --save @nestjs/typeorm typeorm mysql2 --save

(2) pgsql

npm install --save @nestjs/typeorm typeorm pg --save

(3)SQLite

npm install --save @nestjs/typeorm typeorm sqlite3 --save

(4)Microsoft SQL Server

npm install --save @nestjs/typeorm typeorm mssql --save

(5)Oracle

npm install --save @nestjs/typeorm typeorm oracledb --save

app.module.ts 文件下引入

import { TypeOrmModule } from '@nestjs/typeorm'

配置mysql

TypeOrmModule.forRoot({
      type: "mysql", //数据库类型
      username: "root", //账号
      password: "123456", //密码
      host: "localhost", //host
      port: 3306, //
      database: "portal", //库名
      //entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
      //synchronize:true, //synchronize字段代表是否自动将实体类同步到数据库
      retryDelay:500, //重试连接数据库间隔
      retryAttempts:10,//重试连接数据库的次数
      autoLoadEntities:true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
}),

配置sqlite

TypeOrmModule.forRoot({
      type: 'sqlite',
      database: 'XXX.db', //DB位置
      autoLoadEntities: true,
      synchronize: true,
}),

5.登录和注册

使用 bcrypt 对密码进行加密

npm install bcrypt

使用nestjs/jwt生成Token

npm i @nestjs/jwt
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';

@Module({
  imports: [
    JwtModule.register({
      secret: 'YOUR_SECRET_KEY',
      signOptions: { expiresIn: '60s' },
    }),
  ],
})
export class AppModule {}

6.鉴权

npm i @nestjs/passport passport passport-local
npm i -D @types/passport-local
npm i @nestjs/jwt passport-jwt
npm i @types/passport-jwt -D

创建文件 jwt.strategy.ts

import { ExtractJwt, Strategy } from 'passport-jwt'
import { PassportStrategy } from '@nestjs/passport'
import { Injectable } from '@nestjs/common'
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: 'test',
    })
  }
  async validate(payload: any) {
    return { name: payload.name }
  }
}

在module中引入

import { JwtStrategy } from './jwt.strategy'
providers: [AppService, JwtStrategy],

对需要鉴权的接口使用

import { Controller, Get, UseGuards } from '@nestjs/common'
import { AppService } from './app.service'
import { AuthGuard } from '@nestjs/passport/dist/auth.guard'

@UseGuards(AuthGuard('jwt')) // 使用 JWT 鉴权
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
  @Get()
  getHello(): string {
    return this.appService.getHello()
  }
}