文章的地址
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 {// 尝试验证tokenconst 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 {}