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()
}
}