Node 后台学习笔记-毕设篇(旅游信息管理平台)
-
使用技术栈:Node + ts + nestjs + typeorm + MySQL
-
简介:
- 这是款具有上传下载、发布文章、评论、用户个人中心 的一款 旅游资源管理项目。
- 可对数据库进行操作
-
项目链接: github.com/donwenx
登录态处理
实现原理
目录结构
首先在 src
目录下创建一个 common
文件夹,用来存放一些公用的东西
例如:后面要用的 user.decorator.ts
和 user.middleware.ts
文件
实现一个中间件 user.middleware.ts
用来处理路由 token 登录状态
中间件逻辑
// user.middleware.ts
import { Inject, Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";
import { TokenService } from "src/token/token.service";
@Injectable()
export class UserMiddleware implements NestMiddleware {
@Inject()
private readonly tokenService: TokenService;
async use(req: Request, res: Response, next: NextFunction) {
// 获取请求头的token字符串
const token = req.headers.token as string
// 查询token是否过期,未过期返回token信息,过期为null
const data = await this.tokenService.getTokenInfo(token)
// 将token信息放到请求头中
req.headers.tokenInfo = JSON.stringify(data)
next()
}
}
中间件应用
应用到 app.module.ts
中
// app.module.ts
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";
import { UserMiddleware } from "./common/user.middleware";
// .... 省略多余内容
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(UserMiddleware) // 应用 UserMiddleware
.forRoutes("/");
}
}
装饰器实现
通过装饰器 user.decorator.ts
解析请求数据,然后返回
// user.decorator.ts
import { ExecutionContext, createParamDecorator } from "@nestjs/common";
export const GetUserId = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
// 拿到request中的信息
const request = ctx.switchToHttp().getRequest();
console.log("tokenInfo", request.headers.tokenInfo);
// 从json格式解析字符串
const tokenInfo = JSON.parse(request.headers.tokenInfo);
// 拿到userId
const userId = tokenInfo.userId;
return userId || "";
}
);
退出登录实现
现在可以实现用户退出登录接口
// user.controller.ts
import { GetUserId } from 'src/common/user.decorator';
@Post('/logOut')
async logOut(@GetUserId() userId: string) {
console.log('test', userId)
return { 'userId': userId }
}
测试
退出登录测试