快捷搜索:  手机  明星

mysql常见部署架构(手把手搭建koa2后端服务器-配置)

mysql常见部署架构(手把手搭建koa2后端服务器-配置)// src/controll/common/view.ts async register(ctx: Context) { ...... // 注册用户 user = new User(); user.username = data.username; user.password = data.password; user.email = data.email; await User.createUser(user); response.success(ctx data '注册成功'); }添加用户注册路由/** * @description 创建用户 * @param user */ static async createUser(user: User) { try { const userReposit

mysql常见部署架构(手把手搭建koa2后端服务器-配置)(1)

安装 typeORM、reflect-metadata、mysql2

yarn add typeorm reflect-metadata mysql2 yarn add -D @types/reflect-metadata开启 tsconfig.json 中的装饰器修饰

"emitDecoratormetadata": true "experimentalDecorators": true 开启 es6 编译

tsconfig.json 中添加 lib 的 es6 支持,或者安装 @types/es6-shim

"lib": ["es6"]创建配置文件 ormconfig.json

如果使用 typeorm --init 初始化配置文件,一定要注意:

  • typeorm 需要安装在全局
  • 不要在当前项目下执行命令,否则会覆盖掉当前项目的配置文件

建议在空目录执行此命令,把生成的配置文件拷贝到现有项目中

{ "type": "mysql" "host": "localhost" "port": 3306 "username": "root" "password": "123456" "database": "node-test" "synchronize": true "logging": false "entities": [ "src/entity/**/*.ts" ] "migrations": [ "src/migration/**/*.ts" ] "subscribers": [ "src/subscriber/**/*.ts" ] "cli": { "entitiesDir": "src/entity" "migrationsDir": "src/migration" "subscribersDir": "src/subscriber" } }

  • synchronize:程序启动时是否同步模型数据。
  • entities:要加载的实体类和目录路径。
  • migrations:要加载的迁移类和目录。
  • subscribers:要加载并用于此连接的订阅者的目录。
  • cli.entitiesDir - CLI 默认情况下创建实体的目录。
  • cli.migrationsDir - CLI 默认情况下创建迁移的目录。
  • cli.subscribersDir - CLI 默认情况下创建订阅者的目录。
  • 配置文档:https://typeorm.bootcss.com/connection-options
使用typeorm服务建立连接

// src/main.ts import 'reflect-metadata'; import { createConnection } from 'typeorm'; createConnection().then(async (_) => { runServer(config.server.port); });创建ORM模型

  • 创建模型文件

// app/entiry/User.ts import { Entity Column PrimaryGeneratedColumn CreateDateColumn } from 'typeorm'; @Entity() export default class User { @PrimaryGeneratedColumn() // @ts-ignore id: number; @Column({ unique: true nullable: false }) // @ts-ignore username: string; @Column({ nullable: false length: 64 }) // @ts-ignore password: string; @Column() // @ts-ignore email: string; @CreateDateColumn() // @ts-ignore createdAt: Date; }

创建好模型后,此时启动服务器,将会在数据库中创建 user 表,因为我们在 ormconfig.json 中配置了 synchronize: true,会在服务启动的时候保持数据库和模型的同步,在实际项目开发中建议将此项关闭,防止误修改数据库。

使用ORM模型

在注册用户逻辑中使用 User 模型创建新的用户,用户注册逻辑如下:

  • 参数校验
  • 检查用户是否存在
  • 创建新用户,并返回成功信息
参数校验

// src/controller/common/rules.ts export const registRules: Rules = { username: { type: 'string' min: 8 required: true } password: { type: 'string' min: 8 required: true } confirm: { type: 'string' min: 8 required: true validator: (_ value callback values) => { if (value !== values.password) { callback(new Error('两次密码不一致')); } callback(); } } email: { type: 'string' required: true } };

// src/controller/common/types.ts export interface RegisterParam { username: string; password: string; confirm: string; email: string; }

// src/controller/common/view.ts import { RegisterParam } from './types'; import { registRules } from './rules'; async register(ctx: Context) { const { data error } = await validate<RegisterParam>(ctx registRules); if (error) { ctx.body = error return } }检查用户是否存在

在 User 模型中添加静态方法:getUserInfo,根据用户名查询用户是否存在

// app/entity/User.ts import { getRepository } from 'typeorm'; import type { Repository } from 'typeorm'; /** * @description 获取用户信息 * @param username 用户名 * @returns */ static async getUserInfo(username: string) { const user: User | undefined = await getRepository(User).findOne({ username }); return user; }

// src/controller/common/view.ts async register(ctx: Context) { // 校验用户是否已经存在 const user: User | undefined = await User.getUserInfo(data.username); if (user) { response.error(ctx '用户名已存在'); return; } }创建新用户,并返回成功信息

在 User 模型中添加静态方法:createUser

/** * @description 创建用户 * @param user */ static async createUser(user: User) { try { const userRepository: Repository<User> = getRepository(User); await userRepository.save(user); } catch (e) { throw e; } }

在用户注册逻辑中调用

// src/controll/common/view.ts async register(ctx: Context) { ...... // 注册用户 user = new User(); user.username = data.username; user.password = data.password; user.email = data.email; await User.createUser(user); response.success(ctx data '注册成功'); }

添加用户注册路由

// src/controller/common/router.ts router.post('/register' IndexController.register);

猜您喜欢: