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'
路径将匹配abcd
、ab_cd
、abecd
等。 - 可以使用正则表达式中的
?
、+
、*
和()
简单逻辑。 - 连字符 (
-
) 和点 (.
) 按字面意思解释为基于字符串的路径。
状态码
- 默认情况下响应
状态代码
始终为 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()
有两个参数url
和statusCode
,两者都是可选的。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`;
}
- 实例
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 }
}
执行完成截图
三、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 {}
然后就可以测试了,写入数据库
测试结果