热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node使用Egg框架之上TS的教程(四)

在使用了之前教程的骨架代码一段时候,有同学说,typegoose出新包,大改了。现在写法变化了很多。于是就有了这个typegoose新包的骨架代码教程。本次教材地址:github.


在使用了之前教程的骨架代码一段时候,有同学说,typegoose出新包,大改了。现在写法变化了很多。于是就有了这个 typegoose新包的骨架代码教程。



本次教材地址: github.com/liangwei010…


版本:



  • node:v12.14.0

  • @typegoose/typegoose: 6.4.0


先对比下前后typegoose之前的写法



  1. 引入的包不一样了


// 之前是这样写的
import { index, prop, instanceMethod, staticMethod } from 'typegoose';
// 现在是这样写的
import { index, getModelForClass, prop } from '@typegoose/typegoose';


  1. 实例方法和之前不一样了(简洁了许多)


// 之前实例方法是加注解就好了
export default class User extends Typegoose {
@instanceMethod
public async userInstanceTestMethods(this: InstanceType) {
}
}
// 现在直接写就好了不用注解
export default class User extends Typegoose {
public async userInstanceTestMethods() {
}
}


  1. 静态方法和之前不一样了(简洁了许多)


// 之前静态方法是加注解就好了
export default class User extends Typegoose {
@staticMethod
public async userStaticTestMethods(this: InstanceType) {
}
}
// 现在直接写就好了不用注解
export default class User extends Typegoose {
public static async userStaticTestMethods() {
}
}


  1. 导出Model, 现在getModelForClass直接使用即可


// 之前是这样写的
export const UserModel = new User().getModelForClass(User);
// 现在是这样写的
export const UserModel = getModelForClass(User);


  1. buildSchema 函数 (单元测试的ctx.model可能会需要)


// 从class 获取 Schema
const TradeSchema = buildSchema(User);
// 如果需要Schema的话
export default (app: Application) => {
const mOngoose= app.mongoose;
const UserSchema = buildSchema(Order);
UserSchema.loadClass(OrderClass);
return mongoose.model('Order', UserSchema);
}

type-graphql 使用JSON类型


找了很久type-graphql使用any或者json的文档或者例子,都是只支持type-graphql的基础类型,和class类型。然后,就自己定义一个JSON类型吧。



  • GraphQLScalarType 自定义(我封装了两个,一个查询用的,一个新增用的)


import { GraphQLScalarType } from "graphql";
// 自定义 名称为JSON的类型
export const JosnScalar = new GraphQLScalarType({
name: "JSON",
description: "验证 JSON 类型",
parseValue(value: any) {
if (Object.prototype.toString.call(value) !== '[object Object]') {
throw new Error('亲,参数不是一个对象呢!');
}
return value;
},
serialize(value: any) {
return value;
},
});


  • 使用自定义JSON类型例子一


// 输入参数
@ArgsType()
export class DefaultMutation {
@Field(() => JosnScalar, { nullable: true })
data: any;
}

@Mutation(() => User, { description: '增加用户' })
async addUser(@Args() { data }: DefaultMutation, @Ctx() ctx: Context) {
// 这里的 data 指向 DefaultMutation 属性的data也就是any类型
const user = await ctx.service.user.createUser(data);
return user;
}


  • 使用自定义JSON类型例子二


@ArgsType()
export class DefaultQuery {
@Field(() => JosnScalar, { nullable: true })
filter: any;
@Field(() => JosnScalar, { nullable: true })
order: any;
@Field(() => JosnScalar, { nullable: true })
page: any;
}
// 使用
@Query(() => [User], { description: '查询用户列表' })
async getUser(@Args() { filter, order, page }: DefaultQuery, @Ctx() ctx: Context) {
return await ctx.service.user.filterUser(filter, order, page);
}

egg中 mongoose 的 transaction



  • 提取公用函数,封装到上下文ctx中


// extend/context.ts
import { Context } from 'egg';
export default {
// 获取session,回滚事务
async getSession(this: Context) {
// Start a session.
const session = await this.app.mongoose.startSession();
// Start a transaction
// 这里因为获取到的session也是要startTransaction,所以,就一并在这写掉
session.startTransaction();
return session
}
}



  • 事务使用
    mongodb的事务比较low,开启事务,需要副本集,否则会报: Transaction numbers are only allowed on a replica set member or mongos


/**
* 测试事务
*/
public async testErrorTransaction() {
const session: any = await this.ctx.getSession();
try {
const user = new UserModel();
user.userName = 'add user';
user.userNo = 103;
(await UserModel.create(user)).$session(session)
// 没有userNo将会报错
const user1 = new UserModel();
(await UserModel.create(user)).$session(session)
console.log(user1);
// 提交事务
await session.commitTransaction();
} catch (err) {
// 事务回滚
await session.abortTransaction();
throw err;
} finally {
await session.endSession();
}
}

这个骨架使用应该没有啥问题啦,有啥问题欢迎大家指出。谢谢!别忘记给我点星星哦,再次谢谢啦!




推荐阅读
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 在使用 Ant Design 的 SubMenu 组件时,遇到无法读取 'isRootMenu' 属性的 TypeError。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • 探讨如何在C++中,当子类实例存储在父类类型的向量中时,正确访问子类特有的成员变量或方法。 ... [详细]
  • 本文详细介绍了`org.kie.workbench.common.stunner.bpmn.definition.UserTask.getGeneral()`方法的使用场景和具体实现,并提供了多个实际代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Python中调用Java代码的方法与实践
    本文探讨了如何在Python环境中集成并调用Java代码,通过具体的步骤和示例展示了这一过程的技术细节。适合对跨语言编程感兴趣的开发者阅读。 ... [详细]
  • 理解Redux中的中间件及其应用
    在React应用中,Redux的中间件用于增强store的功能,通过拦截和处理action,可以在action到达reducer之前进行额外的操作,如异步操作、日志记录等。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
author-avatar
奋斗LXH_393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有