) {
}
}
// 现在直接写就好了不用注解
export default class User extends Typegoose {
public static async userStaticTestMethods() {
}
}
- 导出Model, 现在getModelForClass直接使用即可
// 之前是这样写的
export const UserModel = new User().getModelForClass(User);
// 现在是这样写的
export const UserModel = getModelForClass(User);
- 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;
},
});
// 输入参数
@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;
}
@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
// 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();
}
}
这个骨架使用应该没有啥问题啦,有啥问题欢迎大家指出。谢谢!别忘记给我点星星哦,再次谢谢啦!