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 {} 
相关推荐
奈斯先生Vector29 分钟前
告别工具碎片化:基于 Nano Banana 全模态 AI 聚合架构搭建“文本-图像-视频”自动化协同生产线
运维·数据库·人工智能·架构·自动化·aigc·音视频
建筑工程企业管理系统2 小时前
erp工程项目管理系统落地价值:实现工程多项目成本精细化核算与管控
大数据·数据库·人工智能
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
foolishlee3 小时前
Neon wal日志处理流程2
数据库
2601_965798474 小时前
Is Hygia Good for Maid & Janitorial Sites? Technical Audit
服务器·网络·数据库
Cloud云卷云舒4 小时前
海山数据库(HaishanDB)面向工业云场景技术方案
数据库·haishandb·工业云·移动云海山数据库·天工云
逃逸线LOF4 小时前
Spring配置数据源{连接池}(Druid、c3p0)
java·数据库·spring
严同学正在努力7 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑7 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
花青泽7 小时前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13
数据库·sql