nestjs完整增删改查(含jwt认证,md5加密,异常捕获和管道验证以及拦截器使用)_nestjs md5(1)

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

// 创建jwt的验证守卫模块(可以校验token是否过期)
nest g guard yiyuan
// 创建异常捕获过滤器模块
nest g filter yiyuan
// 创建拦截器模块,拦截所有请求并响应
nest g interceptor yiyuan


## 3.创建三个公共模块(里面代码可以复用,简单来说就是把这三个模块当成工具包就行)


**1.jwt校验token是否过期**  
 **在刚刚创建的yiyuan.guard.ts里面直接放入以下代码即可**



import {
CanActivate,
ExecutionContext,
Inject,
Injectable,
UnauthorizedException,
} from ‘@nestjs/common’;
import { JwtService } from ‘@nestjs/jwt’;
import { Request } from ‘express’;
import { Observable } from ‘rxjs’;

@Injectable()
export class YiyuanGuard implements CanActivate {
// 注入jwt
@Inject(JwtService)
private jwtservice: JwtService;

canActivate(
context: ExecutionContext,
): boolean | Promise | Observable {
// 接下来就是逻辑问题
const request: Request = context.switchToHttp().getRequest();
const authorization = request.header(‘authorization’) || ‘’;
const bearer = authorization.split(’ ');
if (!bearer || bearer.length < 2) {
throw new UnauthorizedException(‘登陆token有误’);
}
const token = bearer[1];
try {
console.log(‘token’, token);
this.jwtservice.verify(token);
// (request as any).username = info.username;
return true;
} catch (e) {
throw new UnauthorizedException(‘登陆token失败,请重新登陆’);
}
}
}


**2.异常捕获过滤器**  
 **在刚刚生成的yiyuan.filter.ts里面直接插入以下代码即可**



import {ArgumentsHost,Catch, ExceptionFilter, HttpException} from ‘@nestjs/common’;

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp(); // 获取请求上下文
const response = ctx.getResponse(); // 获取请求上下文中的 response对象
const status = exception.getStatus(); // 获取异常状态码

// 设置错误信息
const message = exception.message
  ? exception.message
  : `${status >= 500 ? 'Service Error' : 'Client Error'}`;
const errorResponse = {
  data: {},
  message: message,
  code: -1,
};

// 设置返回的状态码, 请求头,发送错误信息
response.status(status);
response.header('Content-Type', 'application/json; charset=utf-8');
response.send(errorResponse);

}
}


**3.请求拦截器**  
 **在刚刚创建的yiyuan.interceptor.ts里面直接插入以下代码即可**



import {CallHandler, ExecutionContext, Injectable,NestInterceptor,} from ‘@nestjs/common’;
import { map, Observable } from ‘rxjs’;

@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable {
return next.handle().pipe(
map((data) => {
return {
data,
code: 0,
msg: ‘请求成功’,
};
}),
);
}
}


**以上三个其中的异常过滤器和请求拦截器需要在main.ts注册一下,代码如下**



import { NestFactory } from ‘@nestjs/core’;
import { AppModule } from ‘./app.module’;
import { ValidationPipe } from ‘@nestjs/common’;
import { HttpExceptionFilter } from ‘./yiyuan/yiyuan.filter’; //引入异常过滤器
import { TransformInterceptor } from ‘./yiyuan/yiyuan.interceptor’; //引入请求拦截器

async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
app.useGlobalFilters(new HttpExceptionFilter()) // 注册异常过滤器
app.useGlobalInterceptors(new TransformInterceptor()) //注册请求拦截器
await app.listen(3000);
}
bootstrap();


[关于jwt认证这个包的使用方式,点我直达:第一个使用的地方](#jwt2)  
 [关于jwt认证这个包的使用方式,点我直达:第二个使用的地方](#jwt)


## 4.以上的前置准备做完以后,接下来直接上手项目


### 1.在app.module.ts里面连接数据库



import { Module } from ‘@nestjs/common’;
import { AppController } from ‘./app.controller’;
import { AppService } from ‘./app.service’;
import { TypeOrmModule } from ‘@nestjs/typeorm’;
import { YiyuanModule } from ‘./yiyuan/yiyuan.module’;
@Module({
imports: [
TypeOrmModule.forRoot({
type: ‘mysql’,
host: ‘localhost’,
port: 3306,
username: ‘root’,
password: ‘admin’,
database: ‘shop’,
autoLoadEntities: true,
synchronize: true,
}),
YiyuanModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}


### 2.在yiyuan.entity.ts里面创建实体类



import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
} from ‘typeorm’;
@Entity()
export class Yiyuan {
@PrimaryGeneratedColumn({ comment: ‘自增id主键’ })
id: number;

@Column({ comment: ‘用户名’ })
username: string;

@Column({ comment: ‘密码’ })
password: string;

@CreateDateColumn({ comment: ‘创建时间’ })
createTime: Date;

@UpdateDateColumn({ comment: ‘更新时间’ })
updateTime: Date;

@Column({ default: false })
isActive: boolean; // 修改用户权限(true为有权限,false为无权限)
}


### 3.在yiyuan.module.ts进行引入


(这里是使用jwt的第一个地方,在这里定义jwt的秘钥和过期时间)



import { Module } from ‘@nestjs/common’;
import { YiyuanService } from ‘./yiyuan.service’;
import { YiyuanController } from ‘./yiyuan.controller’;
import { Yiyuan } from ‘./entities/yiyuan.entity’;
import { TypeOrmModule } from ‘@nestjs/typeorm’;
import { JwtModule } from ‘@nestjs/jwt’;
@Module({
imports: [TypeOrmModule.forFeature([Yiyuan]),JwtModule.register({
secret:‘123456’, //秘钥
signOptions:{
expiresIn:“60h” // 过期时间,这个是60小时
}
})],
controllers: [YiyuanController],
providers: [YiyuanService],
})
export class YiyuanModule {}


### 4.在dto里面进行数据校验


**create-yiyuan.dto.ts里面代码如下**



import { IsNotEmpty } from ‘class-validator’;
export class CreateYiyuanDto {
id: number;
// 登录
@IsNotEmpty({ message: ‘缺少用户名信息’ })
username: string;
@IsNotEmpty({ message: ‘缺少密码’ })
password: string;
isActive: boolean;
}


**update-yiyuan.dto.ts里面代码如下**



import { IsNotEmpty } from ‘class-validator’;
export class UpdateYiyuanDto {
@IsNotEmpty({ message: ‘缺少id’ })
id: number;
}


**这里的class-validator在前面我们是已经安装过了,这里使用完需要到main.js去注册一下,否则不会起作用,代码如下**



import { NestFactory } from ‘@nestjs/core’;
import { AppModule } from ‘./app.module’;
import { ValidationPipe } from ‘@nestjs/common’;
import { HttpExceptionFilter } from ‘./yiyuan/yiyuan.filter’;
import { TransformInterceptor } from ‘./yiyuan/yiyuan.interceptor’;

async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe()); // 注册管道进行验证数据
app.useGlobalFilters(new HttpExceptionFilter())
app.useGlobalInterceptors(new TransformInterceptor())
await app.listen(3000);
}
bootstrap();


### 5.在yiyuan.controller.ts创建路由


这里是jwt的第二个地方  
 **PS:jwt的验证在这里使用,在哪个接口上面使用了@UseGuards(YiyuanGuard)哪个接口就必须使用带有token的header进行请求,否则在jwt的验证里面直接返回了,其中YiyuanGuard为上面创建的工具守卫**



import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
Query,
HttpException,
UseGuards,
} from ‘@nestjs/common’;
import { YiyuanService } from ‘./yiyuan.service’;
import { CreateYiyuanDto } from ‘./dto/create-yiyuan.dto’;
import { UpdateYiyuanDto } from ‘./dto/update-yiyuan.dto’;
import { YiyuanGuard } from ‘./yiyuan.guard’;
@Controller(‘yiyuan’)

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

nimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
[外链图片转存中…(img-ZbNKFRku-1715897153407)]
[外链图片转存中…(img-Hx10Hw8Q-1715897153408)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的要求,我来介绍一下nestjs如何实现用户注册、登录和验证功能,并使用@body()装饰jwt和passport来实现登录接口。 首先,我们需要安装nestjs的依赖包: ``` npm i @nestjs/common @nestjs/core @nestjs/platform-express @nestjs/typeorm typeorm mysql passport passport-local @nestjs/passport passport-jwt @nestjs/jwt ``` 然后,我们需要创建一个User实体类,在这个实体类中定义用户的属性和方法。示例代码如下: ```typescript import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() username: string; @Column() password: string; } ``` 接着,我们需要创建一个UserService服务,用于实现用户注册、登录和验证功能。示例代码如下: ```typescript import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; import * as bcrypt from 'bcrypt'; @Injectable() export class UserService { constructor( @InjectRepository(User) private readonly userRepository: Repository<User>, ) {} async register(username: string, password: string): Promise<User> { const saltOrRounds = 10; const hash = await bcrypt.hash(password, saltOrRounds); const user = new User(); user.username = username; user.password = hash; return await this.userRepository.save(user); } async login(username: string, password: string): Promise<User> { const user = await this.userRepository.findOne({ username }); if (user && await bcrypt.compare(password, user.password)) { return user; } return null; } async validateUser(username: string, password: string): Promise<User> { const user = await this.userRepository.findOne({ username }); if (user && await bcrypt.compare(password, user.password)) { return user; } return null; } } ``` 在上面的代码中,我们使用了Injectable装饰来定义UserService服务,使用InjectRepository装饰来注入User实体类的Repository对象,然后在register、login和validateUser方法中实现用户注册、登录和验证功能。在register和login方法中,我们使用bcrypt加密库对密码进行加密和校验,保证密码的安全性。 接下来,我们需要创建一个AuthController控制,用于定义用户注册、登录和验证接口。示例代码如下: ```typescript import { Controller, Post, Body, Req, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { AuthService } from './auth.service'; import { UserService } from '../user/user.service'; @Controller() export class AuthController { constructor( private readonly authService: AuthService, private readonly userService: UserService, ) {} @Post('/register') async register(@Body('username') username: string, @Body('password') password: string): Promise<any> { const user = await this.userService.register(username, password); return { code: 200, message: '注册成功', data: user }; } @Post('/login') @UseGuards(AuthGuard('local')) async login(@Req() req): Promise<any> { const token = await this.authService.generateToken(req.user); return { code: 200, message: '登录成功', data: { user: req.user, token } }; } @Post('/profile') @UseGuards(AuthGuard('jwt')) async profile(@Req() req): Promise<any> { return { code: 200, message: '获取用户信息成功', data: req.user }; } } ``` 在上面的代码中,我们使用了Controller装饰来定义AuthController控制使用Post装饰来定义register、login和profile接口,并使用@Body()装饰来获取请求体中的username和password参数,在register方法中调用UserService服务中的register方法来实现用户注册功能。在login方法中,我们使用@UseGuards(AuthGuard('local'))装饰使用passport-local策略实现用户登录,并使用AuthService服务中的generateToken方法生成jwt token。在profile方法中,我们使用@UseGuards(AuthGuard('jwt'))装饰使用passport-jwt策略验证jwt token,并返回用户信息。 接着,我们需要创建一个AuthService服务,用于实现jwt token的生成和验证功能。示例代码如下: ```typescript import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { User } from '../user/user.entity'; @Injectable() export class AuthService { constructor(private readonly jwtService: JwtService) {} async generateToken(user: User): Promise<string> { const payload = { username: user.username, sub: user.id }; return this.jwtService.sign(payload); } async validateToken(token: string): Promise<any> { try { const payload = this.jwtService.verify(token); return payload; } catch (error) { return null; } } } ``` 在上面的代码中,我们使用了Injectable装饰来定义AuthService服务,使用JwtService来生成和验证jwt token,其中generateToken方法将用户信息添加到payload中,然后使用this.jwtService.sign方法生成jwt token,并返回生成的jwt token。validateToken方法使用this.jwtService.verify方法验证jwt token的有效性,并返回payload中的信息。 最后,我们需要在app.module.ts中配置PassportModule和JwtModule。示例代码如下: ```typescript import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './user/user.entity'; import { UserService } from './user/user.service'; import { UserController } from './user/user.controller'; import { AuthController } from './auth/auth.controller'; import { AuthService } from './auth/auth.service'; import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'root', database: 'nestjs', entities: [User], synchronize: true, }), TypeOrmModule.forFeature([User]), PassportModule.register({ defaultStrategy: 'jwt' }), JwtModule.register({ secret: 'nestjs', signOptions: { expiresIn: '60s' }, }), ], controllers: [UserController, AuthController], providers: [UserService, AuthService], }) export class AppModule {} ``` 在上面的代码中,我们使用了PassportModule和JwtModule来配置passport和jwt的相关信息,其中PassportModule.register方法中的{ defaultStrategy: 'jwt' }表示默认使用jwt策略,JwtModule.register方法中的secret表示生成jwt token的密钥,signOptions中的expiresIn表示jwt token的过期时间。 至此,我们就完成了nestjs实现用户注册、登录和验证功能,并使用@body()装饰jwt和passport来实现登录接口的教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值