前言:
我一直都是用java的springboot开发项目,然后进来新公司之后,公司的后端是用node.js,然后框架用的是 midwayjs ,然后网上的资料比较少,在此特地记录一波
文档:
1.官方文档:介绍 | Midway
2.controller的参数传递以接参:路由和控制器 | Midway
1.创建项目
先创建一个空文件夹,然后在文件夹里面执行cmd命令:
npm init midway@latest -y
然后一直按回车,就可以得到这个以下项目:
2.项目情况:
配置端口号,以及全局路由前缀:
然后运行:npm run dev 来执行项目
3.连接数据库(MikroORM)
1.在这里我使用的是 MikroORM 来连接数据库的
首先在终端执行以下命令,下载MikroORM和mysql的依赖:npm i -s @mikro-orm/core @mikro-orm/mysql npm i @midwayjs/mikro@3 @mikro-orm/core --save
执行完毕之后,在 package.json 文件里面的 dependencies 值就会多出这两个值:
然后在 configuration.ts 这个文件里面,导入 MikroORM:
导入代码:import * as mikro from '@midwayjs/mikro';
然后在 config.default.ts 文件里面添加mikro的数据源:
代码:mikro: {dataSource: {default: {dbName:'nk_product_pro', // 数据库名type: 'mysql',host: 'localhost', // 这里是连接的ip地址port: 3306,// 端口号username: 'root', // 账号password: '***', // 密码// 配置实体模型entities: [userNameModel],// // 或者扫描形式// entities: [// '**/entity/*.entity{.ts,.js}'// ]},}}
其中的 userNameModel :
userNameController:import { Inject, Controller, Get } from '@midwayjs/core'; import {userNameService} from "./userService";@Controller('/userName') export class userNameController {@Inject()userNameService: userNameService;@Get('/userName')async userName() {console.log('进入方法');await this.userNameService.getUserName();return { success: true, message: 'OK', data: '进入userName方法' };} }
userModel.ts:
import {Entity, PrimaryKey, Property} from "@mikro-orm/core";@Entity({ tableName: 'test_user', schema: 'nk_product_pro' }) // 这里的 tableName 指定的是表名 schema: 是数据库名 export class userNameModel {@PrimaryKey()@Property()id: number;@Property()title:string;}
userService.ts:
import {Provide} from "@midwayjs/core"; import {InjectRepository} from "@midwayjs/mikro"; import {EntityRepository} from "@mikro-orm/mysql"; import {userNameModel} from "./userModel";@Provide() export class userNameService{@InjectRepository(userNameModel)// 这个就类似java的 mapper private readonly chatRoomRepo: EntityRepository<userNameModel>async getUserName(){console.log(await this.chatRoomRepo.findAll());console.log('获取成功');}}
这个是比较常见的增删改查方式:import {Provide} from "@midwayjs/core";import {InjectEntityManager, InjectRepository} from "@midwayjs/mikro"; import {userNameModel} from "./userModel"; import { EntityManager, EntityRepository } from '@mikro-orm/mysql'; // 需要使用数据库驱动对应的类来执行操作// @ts-ignore @Provide() export class userNameService{@InjectRepository(userNameModel)// 这个就类似java的 mapperprivate readonly chatRoomRepo: EntityRepository<userNameModel>@InjectEntityManager()em: EntityManager;async getUserName(){console.log(await this.chatRoomRepo.findAll());// 查询// await this.chatRoomRepo.find(// {// id: 1, 这个是查询id字段的值 等于 1// paixu2: 1,// title: { $like: '%' }, // 模糊查询// paixu: { $gt: 1 }, // 大于 1// id: { $in: [1, 2] }, // 数据库的in查询// },// {// orderBy: { paixu: QueryOrder.desc, paixu2: QueryOrder.desc }, // 按照某个字段进行排序,例如:先对 paixu 这字段进行降序,在 paixu 这个值一致的情况下,再进行降序// limit: 1, //获取多少条数据// },// );// 插入// const model = new userNameModel();//// model.title = '哈哈,你好呀';// // 单条插入// this.chatRoomRepo.nativeInsert(model);// 修改// this.chatRoomRepo.nativeUpdate({// id: 1// },{// title:'你好呀'// })// // 上面的修改sql会变成:update "nk_product_pro"."test_user" set "title" = '你好呀' where "id" = 1// // 删除// this.chatRoomRepo.nativeDelete({// id : 1,// title: '你好呀'// })// // 以上的删除语句:delete from "nk_product_pro"."test_user" where "id" = 1 and "title" = '你好呀'console.log(this.em)// 这个是直接使用原生sql的方式,在遇到比较复杂,或者进行连表查询的时候,推荐使用这种方式const ctionEm = this.em.getConnection();const ret = await ctionEm.execute("select * from nk_product_pro.test_user");console.log(ret)}}