1.0.1 • Published 3 years ago

@akizuki/egg-typegoose v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

egg-typegoose

NPM version npm download

Install

$ npm i @akizuki/egg-typegoose --save

Usage

// {app_root}/config/plugin.ts
exports.typegoose = {
  enable: true,
  package: 'egg-typegoose',
};

Configuration

// {app_root}/config/config.default.ts
exports.typegoose = { 
  url: 'mongodb://localhost:27017/test',
  options: {},
  modelWhitelist: ['BaseModel'], // 文件白名单列表, 不挂载到ctx.model
};

see config/config.default.ts for more detail.

Example

├── controller
│    └── user.ts
├── model
│    ├── BaseModel.ts
│    └── User.ts
├── service
│    └── user.ts
├── router.ts
// {app_root}/app/controller/user.ts
import { Controller } from 'egg';
import User from '../model/User';

/**
 * User Controller
 */
export default class UserController extends Controller {
  /**
   * 创建用户
   */
  public async createUser() {
    const { ctx } = this;
    const user = new User();
    user.email = 'test@qq.com';
    user.nickname = 'YuYin';
    const result = await ctx.service.user.createUser(user);
    ctx.body = result;
  }

  /**
   * 根据 email 获取用户
   */
  public async getUserByEmail() {
    const { ctx } = this;
    const email = 'test@qq.com';
    const result = await ctx.service.user.getUserByEmail(email);
    ctx.body = result;
  }
}
// {app_root}/app/model/BaseModel.ts
import { prop, pre } from '@typegoose/typegoose';

@pre<BaseModel>('save', function(next) {
  if (!this.createdAt || this.isNew) {
    this.createdAt = this.updatedAt = new Date();
  } else {
    this.updatedAt = new Date();
  }
  next();
})

/**
 * Base Model
 */
class BaseModel {
  /**
   * 创建时间
   */
  @prop()
  createdAt: Date;

  /**
   * 更新时间
   */
  @prop()
  updatedAt: Date;
}

export default BaseModel;
// {app_root}/app/model/User.ts
import { prop } from '@typegoose/typegoose';
import BaseModel from './BaseModel';

/**
 * User Model
 */
export class User extends BaseModel {
  /**
   * 邮箱
   */
  @prop({ required: true, unique: true })
  email!: string;

  /**
   * 昵称
   */
  @prop()
  nickname?: string;
}

export default User;
// {app_root}/app/service/User.ts
import { Service } from 'egg';
import User from '../model/User';

/**
 * User Service
 */
export default class UserService extends Service {
  /**
   * 创建用户
   * @param user User
   */
  public async createUser(user: User) {
    const { ctx } = this;
    const result = await ctx.model.User.create(user);
    return result;
  }
  
  /**
   * 根据 email 获取用户
   * @param email 邮箱
   */
  public async getUserByEmail(email: string) {
    const { ctx } = this;
    const result = await ctx.model.User.findOne({ email });
    return result;
  }
}
// {app_root}/app/router.ts
import { Application } from 'egg';

export default (app: Application) => {
  const { controller, router } = app;

  router.post('/user/createUser', controller.user.createUser);
  router.get('/user/getUserByEmail', controller.user.getUserByEmail);
};

Questions & Suggestions

Please open an issue here.

License

MIT