Skip to content

hexindai/egg-valid

Repository files navigation

egg-valid

A better Validation egg plugin based on @killara/validation

NPM version build status Test coverage David deps Known Vulnerabilities npm download

Install

$ npm i egg-valid -S

Usage

// config
exports.valid = {
  enable: true,
  package: 'egg-valid',
};
// controller
class HomeController extends Controller {
  async index() {
    const { app, ctx } = this;
    const rule = { username: 'required|alpha' };
    const errors = await app.validator.validate(ctx.request.body, rule)
    // ...
  }
}

Rule

Derived from @killara/validation

  • accepted

    • string style: field: 'accepted'
    • object style: field: { accepted: true }
  • alpha

    • string style: field: 'alpha:6' or field: 'alpha:len=6'
    • object style: field: { alpha: { len: 6 } }
  • confirmed

    Rule confirmed: the field need to have the same value as the value that be filled by field_confirmation. We can change field_confirmation to any names with confirmed:"custom"

    • string style: field: 'confirmed' or field: 'confirmed:"custom_field_name"'
    • object style: field: { confirmed: "custom_field_name" }
  • date

    • string style: field: 'date'
    • object style: field: { date: true }
  • datetime

    • string style: field: 'datetime'
    • object style: field: { datetime: true }
  • time

    • string style: field: 'time'
    • object style: field: { time: true }
  • email

    • string style: field: 'email:true'
    • object style: field: { email: true }
  • in

    • array style: field: [ 'basketball', 'football' ]
    • object style: field: { in: [ 'basketball', 'football' ] }
  • money

    • string style: field: 'money' or field: 'money:0' field: 'money:2' (default)
    • object style: field: { money: { decimal: true } } or field: { money: { decimal: 0 } } or field: { money: { decimal: 2 } }
  • numeric

    • string style: field: 'numeric:6' or field: 'numeric:len=6'
    • object style: field: { numeric: { len: 6 } }
  • regexp

    • string style: field: 'regexp:"^123456$"'
    • object style: field: { regexp: new RegExp(/abc/, 'i') } or field: { regexp: /^[0-9a-zA-z]{8,16}$/ }
  • required

    • string style: field: 'required' or field: 'required:true'
    • object style: field: { required: true }

More rules

Custom rules

  • phone (currently support China phone number only)
    • string style: field: 'required|phone'
  • password (length: 8-18, alphanumeric and &*;+$,?#[]%)
    • string style:field: 'password' or field: 'password:min=8,max=18' or field: 'password:"^[a-z0-9!()-._@#]{8,18}$"'
  • captcha (phone auth code)
    • string style:field: 'captcha' or field: 'captcha:6'
    • object style: field: { captcha: { len: 6} }

Messages

Customize validation messages

Via API

class HomeController extends Controller {
  async index() {
    const { app, ctx } = this;
    const rule = { username: 'required|alpha:6' };
    const messages = { 'username.alpha': '该字段应该为长度为6的字母串' };
    const errors = await app.validator.validate(ctx.request.body, rule, messages);
    if (errors) {
      // ...
    } else {
      // ...
    }
  }
}

Via configuration

exports.valid = {
  rules: {
    custom: field => context => params => {
      // We can get `app` and `ctx` from context
      const { app, ctx, options } = context;
      //... return a boolean
    }
  },
  messages: {
    custom: 'a custom message...',
  },
};

API

validation.addRule(name: string, ruleFunc: (field: string) => (context: object) => (params: object) => bool)

  • Add custom rule

validation.addMessage(name: string, message: string)

  • Add custom message

License

MIT