文章的地址
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 {}