Node后台学习笔记-毕设篇-第三章 用户注册实现

125 阅读3分钟

Node 后台学习笔记-毕设篇(旅游信息管理平台)

  • 使用技术栈:Node + ts + nestjs + typeorm + MySQL

  • 简介:

    • 这是款具有上传下载、发布文章、评论、用户个人中心 的一款 旅游资源管理项目。
    • 可对数据库进行操作
  • 项目链接: github.com/donwenx

一、基本的请求方式处理

  • Nest 为所有标准 HTTP 方法提供了装饰器:@Get()@Post()@Put()@Delete()@Patch()@Options()@Head()。此外,@All()定义一个处理所有这些的端点。

路由通配符

路由除了上文支持的普通路由外,还支持基于 正则表达式 的路由。例如,星号用作通配符,将匹配任何字符组合。

@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}
  • 路由 'ab*cd'路径将匹配abcdab_cdabecd等。
  • 可以使用正则表达式中的?+*()简单逻辑。
  • 连字符 ( - ) 和点 ( . ) 按字面意思解释为基于字符串的路径。

状态码

  • 默认情况下响应状态代码始终为 200,POST 请求除外,该代码为 201。我们可以通过@HttpCode(...)在处理程序级别添加装饰器来轻松更改此行为
@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

响应头

  • 设置响应头使用 @Header()
@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}

重定向

  • 设置重定向使用 @Redirect() (并 res.redirect()直接调用)。
  • @Redirect()有两个参数urlstatusCode,两者都是可选的。statusCode如果省略,则默认值为302( Found)。
@Get()
@Redirect('https://nestjs.com', 301)

二、路由参数

GET 处理与路由参数

  • 使用 @Param() 接收参数
  • 例如在 @Get(':id') 设置 id,可以通过 params.id来访问参数,通过名称来直接引用路由参数

@Get(':id')
findOne(@Param() params: any): string {
  console.log(params.id);
  return `This action returns a #${params.id} cat`;
}
  • 实例

01.png

02.png

POST处理与输入校验

输入校验采用的 class-validator 进行数据校验,安装:

npm i --save class-validator class-transformer

一旦安装了这些,我们就可以向类中添加一些装饰器 CreateUserDto。

在里面添加两个参数:name, password

记得建user模块,详情见上一篇文章

nest g resource user
// user.dto.ts
import { IsNotEmpty, Length } from "class-validator";

export class CreateUserDto {
  @IsNotEmpty() // 设置不为空
  @Length(2, 255) // 设置长度为 2 到 255 个字符
  name: string;

  @IsNotEmpty()
  @Length(2, 255)
  password: string;
}
// user.controller.ts
// 添加一个post方法,完成一个注册接口
// 记得引入Body()

 @Post('/create')
  async createUser(@Body() createUserDto: CreateUserDto) {
    return { message: 200, data: createUserDto }
  }

执行完成截图

03.png

三、service层中实现功能函数

实现简单注册用户

注册之前需要先新建一个实体 新建一个 user.entity.ts 文件

// user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class User {
  // PrimaryGeneratedColumn 自动生成
  @PrimaryGeneratedColumn()
  id: number;

  //           长度         字符串类型        唯一
  @Column({ length: 255, type: "varchar", unique: true })
  name: string;

  @Column({ length: 255, type: "varchar" })
  password: string;
}

modules 中导入

// user.module.ts
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
import { TypeOrmModule } from "@nestjs/typeorm";
import { User } from "./user.entity";

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
export class UserModule {}

user.service.ts文件中,编写用户创建函数

// user.service.ts
import { Injectable } from "@nestjs/common";
import { Repository } from "typeorm";
import { User } from "./user.entity";
import { InjectRepository } from "@nestjs/typeorm";

@Injectable()
export class UserService {
  @InjectRepository(User)
  private repository: Repository<User>; // 注入一个User实体

  async createUser(name: string, password: string) {
    const data = new User();
    data.name = name;
    data.password = password;
    return await this.repository.save(data); // 写入数据库
  }
}

user.controller.ts文件中调用并传入 @Body() 中的用户名和密码

// user.controller.ts
import { Body, Controller, Post } from "@nestjs/common";
import { UserService } from "./user.service";
import { CreateUserDto } from "./user.dto";

@Controller("user")
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post("/create")
  async createUser(@Body() createUserDto: CreateUserDto) {
    const data = await this.userService.createUser(
      createUserDto.name,
      createUserDto.password
    );
    return {};
  }
}

app 模块配置

// app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AdminModule } from "./admin/admin.module";
import { UserModule } from "./user/user.module";
import { User } from "./user/user.entity"; // 引入实体

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: "mysql",
      host: "localhost",
      port: 3306,
      username: "root",
      password: "root",
      database: "demo",
      entities: [User], // 添加user实体
      synchronize: true,
    }),
    AdminModule,
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

然后就可以测试了,写入数据库

测试结果

04.png

05.png

目录