NestJS

文章的地址

NestJShttps://equinox-primrose-ceb.notion.site/NestJS-22d4b8031e0f80b39fc7fe1ff111f802

不产生测试的.spec.ts文件的配置

复制代码
"generateOptions": {
		"spec": false
}

创建模型 nest g m xx

创建服务 nest g s xx

创建处理 nest g c xx

CRUD请求整体流程

app.module.ts:全局注入入口

复制代码
import { UserModule } from './user/user.module';
import { Profile } from './profile/profile.entity';

@Module({ 
  imports: [
    ArticleModule,
    UserModule,
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'nestjs_test',
      entities: [Article, Content, Label, User, Profile],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

上面代码配置了数据库还有entities、controller

数据库连接需要用到的包:"@nestjs/typeorm": "^11.0.0","mysql2": "^3.14.1",等等

user为例子

JWT

复制代码
import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import * as jwt from 'jsonwebtoken';

const JWT_SECRET = 'wttoken_yxy';// 建议放到 .env
const IS_DEV_MODE = true; // 开发环境标志

@Injectable()
export class JwtAuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const auth = request.headers['authorization'];
    if (!auth || !auth.startsWith('Bearer ')) {
      throw new UnauthorizedException('未登录或token无效');
    }
    const token = auth.replace('Bearer ', '');
    try {
      // 尝试验证token
      const payload = jwt.verify(token, JWT_SECRET);
      request.user = payload;
      return true;
    } catch (error) {
      // 开发环境下,如果token验证失败,使用固定的测试用户信息
      if (IS_DEV_MODE) {
        console.warn('开发环境: JWT验证失败,使用测试用户身份');
        request.user = { 
          userId: 1, 
          username: 'testuser' 
        };
        return true;
      }
      throw new UnauthorizedException('token无效或已过期');
    }
  }
} 

请求所有用户(查询)

controller

需要标记这是controller层

还需要注入service层,操作service层来操作model进行数据库的CRUD

注入service

复制代码
**constructor(private readonly userService: UserService) {}**

service

导入模型

复制代码
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import { CreateUserDto } from '../dto/create-user.dto';
import { LoginUserDto } from '../dto/login-user.dto';
import { UpdatePasswordDto, UpdateNicknameDto, UpdateRegisterCodeDto } from '../dto/update-user.dto';

user.entity.ts

复制代码
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  username: string;

  @Column()
  password: string;

  @Column({ nullable: true, default: '' })
  nickname: string;

  @CreateDateColumn()
  createTime: Date;

  @UpdateDateColumn()
  updateTime: Date;
} 

id是数字主键自增 username字符串唯一 nickname字符串不能为空默认' ' createTime日期格式

@CreateDateColumn() 创建日期格式 @UpdateDateColumn() 修改日期格式

接上面查询所有用户

复制代码
async findAll() {
    // 不返回密码字段,但返回昵称字段
    const users = await this.userRepository.find();
    return users.map(user => {
      const { password, ...result } = user;
      return result;
    });
  }

这段代码的含义是:查询所有的用户信息,

复制代码
/**
   * 查询所有用户信息,但不返回密码字段,保留昵称等其他字段
   * 1. 从数据库查出所有用户
   * 2. 遍历每个用户对象,去掉 password 字段
   * 3. 返回处理后的用户列表
   */

Module

复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { Profile } from '../profile/profile.entity';
import { UserService } from './user.service';
import { ProfileService } from '../profile/profile.service';
import { UserController } from './user.controller';
import { ProfileController } from '../profile/profile.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User, Profile])],
  providers: [UserService, ProfileService],
  controllers: [UserController, ProfileController],
  exports: [UserService, ProfileService],
})
export class UserModule {} 
相关推荐
zcmodeltech5 分钟前
风力发电沙盘模型控制系统设计与灯光联动实现方案——基于STM32与Modbus RTU,服务范围覆盖全国的多场景风力发电沙盘模型定制
网络·数据库·stm32·单片机·嵌入式硬件·能源
程序员黎剑13 分钟前
MySQL-JOIN优化-NLJ与BNL的区别与实战
数据库·mysql
Java小白笔记13 分钟前
MyBatis XML Mapper 标签与 CRUD 原理实战
xml·数据库·mybatis
JavaPub-rodert42 分钟前
一个后台系统如何同时支持 MySQL、PostgreSQL、SQLite、SQL Server?从 ShiyuAdmin 的 GORM 多数据库适配说起
数据库·mysql·postgresql
小翰生信43 分钟前
转录组下游分析全流程:DESeq2 差异分析、GO/KEGG 富集与 GSEA 实战
数据库·矩阵·golang
2603_966437261 小时前
拷贝中断文件丢失,电脑资料抢救实操方案
数据库·电脑
harmony&1 小时前
MySQL 数据库从入门到实战:原理、安装与 SQL 详解
数据库·sql·mysql
艺杯羹1 小时前
全栈信创落地实录:基于银河麒麟V10与达梦数据库DM8的SpringBoot工业级适配指南
java·数据库·spring boot·后端·spring
坚定信念,勇往无前6 小时前
mongodb的日志分割
数据库·mongodb
oradh10 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结
数据库·oracle·tx 锁 mode 4·oracle tx 锁