Node后台学习笔记-毕设篇-第五章 登录态处理

43 阅读2分钟

Node 后台学习笔记-毕设篇(旅游信息管理平台)

  • 使用技术栈:Node + ts + nestjs + typeorm + MySQL

  • 简介:

    • 这是款具有上传下载、发布文章、评论、用户个人中心 的一款 旅游资源管理项目。
    • 可对数据库进行操作
  • 项目链接: github.com/donwenx

登录态处理

实现原理

01.png

目录结构

03.png

首先在 src 目录下创建一个 common 文件夹,用来存放一些公用的东西

例如:后面要用的 user.decorator.tsuser.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 }
}

测试

退出登录测试

02.png

目录