nestjs typeorm 用户注册登录验证
时间: 2023-07-23 17:23:47 浏览: 144
注册登录验证js
在 NestJS 中使用 TypeORM 实现用户注册登录验证的步骤如下:
1. 创建 User 实体
首先,你需要创建一个 User 实体,用于表示用户的信息。可以在一个名为 `user.entity.ts` 的文件中定义这个实体,代码如下:
```typescript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
}
```
这个实体包含了用户的 id、username 和 password 三个字段。
2. 创建 User 模块
接下来,你需要创建一个 User 模块,用于处理用户的注册、登录等操作。可以在一个名为 `user.module.ts` 的文件中定义这个模块,代码如下:
```typescript
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from './user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController],
})
export class UserModule {}
```
这个模块依赖于 TypeORM 模块,并导入了 UserService 和 UserController。同时,使用 `TypeOrmModule.forFeature` 方法将 User 实体注册到 TypeORM 中。
3. 创建 UserService
UserService 用于处理用户相关的业务逻辑。在一个名为 `user.service.ts` 的文件中定义这个服务,代码如下:
```typescript
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async findOne(username: string): Promise<User | undefined> {
return this.userRepository.findOne({ username });
}
async create(user: User): Promise<void> {
await this.userRepository.insert(user);
}
}
```
这个服务依赖于 User 实体并使用了 TypeORM 的 Repository 对象来处理数据库操作。其中,`findOne` 方法用于查找指定用户名的用户,`create` 方法用于创建一个新用户。
4. 创建 UserController
UserController 用于处理用户相关的 HTTP 请求。在一个名为 `user.controller.ts` 的文件中定义这个控制器,代码如下:
```typescript
import { Controller, Post, Body, BadRequestException } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post('register')
async register(@Body() user: User): Promise<void> {
const existingUser = await this.userService.findOne(user.username);
if (existingUser) {
throw new BadRequestException('Username already exists');
}
await this.userService.create(user);
}
@Post('login')
async login(@Body() user: User): Promise<void> {
const existingUser = await this.userService.findOne(user.username);
if (!existingUser || existingUser.password !== user.password) {
throw new BadRequestException('Invalid username or password');
}
// TODO: return JWT token
}
}
```
这个控制器包含了两个路由:注册和登录。在注册路由中,先使用 `findOne` 方法检查指定用户名的用户是否已存在,如果已存在则抛出一个 `BadRequestException` 异常,否则使用 `create` 方法将新用户插入到数据库中。在登录路由中,先使用 `findOne` 方法检查指定用户名的用户是否存在且密码是否匹配,如果不匹配则抛出一个 `BadRequestException` 异常。
5. 配置 TypeORM
最后,你需要在 `app.module.ts` 中配置 TypeORM。代码如下:
```typescript
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
UserModule,
],
})
export class AppModule {}
```
在这个配置中,使用了 MySQL 数据库,并将 UserModule 导入到 AppModule 中。其中,`entities` 属性是一个数组,指定了所有的实体类文件,TypeORM 在启动时会将这些实体映射到数据库中。`synchronize` 属性为 true 表示在每次启动时自动同步数据库结构。
到这里,用户注册登录验证的功能就实现了。当用户访问 `/user/register` 路由时,会执行 UserController 中的 register 方法,创建一个新用户。当用户访问 `/user/login` 路由时,会执行 UserController 中的 login 方法,检查用户是否存在并验证密码。可以根据需要进一步完善这个功能,例如使用 JWT 来实现用户身份验证。
阅读全文