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