A better Validation egg plugin based on @killara/validation
$ npm i egg-valid -S
// 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)
// ...
}
}
Derived from @killara/validation
-
accepted
- string style:
field: 'accepted'
- object style:
field: { accepted: true }
- string style:
-
alpha
- string style:
field: 'alpha:6'
orfield: 'alpha:len=6'
- object style:
field: { alpha: { len: 6 } }
- string style:
-
confirmed
Rule
confirmed
: thefield
need to have the same value as the value that be filled byfield_confirmation
. We can changefield_confirmation
to any names withconfirmed:"custom"
- string style:
field: 'confirmed'
orfield: 'confirmed:"custom_field_name"'
- object style:
field: { confirmed: "custom_field_name" }
- string style:
-
date
- string style:
field: 'date'
- object style:
field: { date: true }
- string style:
-
datetime
- string style:
field: 'datetime'
- object style:
field: { datetime: true }
- string style:
-
time
- string style:
field: 'time'
- object style:
field: { time: true }
- string style:
-
email
- string style:
field: 'email:true'
- object style:
field: { email: true }
- string style:
-
in
array
style:field: [ 'basketball', 'football' ]
- object style:
field: { in: [ 'basketball', 'football' ] }
-
money
- string style:
field: 'money'
orfield: 'money:0'
field: 'money:2'
(default) - object style:
field: { money: { decimal: true } }
orfield: { money: { decimal: 0 } }
orfield: { money: { decimal: 2 } }
- string style:
-
numeric
- string style:
field: 'numeric:6'
orfield: 'numeric:len=6'
- object style:
field: { numeric: { len: 6 } }
- string style:
-
regexp
- string style:
field: 'regexp:"^123456$"'
- object style:
field: { regexp: new RegExp(/abc/, 'i') }
orfield: { regexp: /^[0-9a-zA-z]{8,16}$/ }
- string style:
-
required
- string style:
field: 'required'
orfield: 'required:true'
- object style:
field: { required: true }
- string style:
- phone (currently support China phone number only)
- string style:
field: 'required|phone'
- string style:
- password (length: 8-18, alphanumeric and &*;+$,?#[]%)
- string style:
field: 'password'
orfield: 'password:min=8,max=18'
orfield: 'password:"^[a-z0-9!()-._@#]{8,18}$"'
- string style:
- captcha (phone auth code)
- string style:
field: 'captcha'
orfield: 'captcha:6'
- object style:
field: { captcha: { len: 6} }
- string style:
Customize validation messages
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 {
// ...
}
}
}
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...',
},
};
validation.addRule(name: string, ruleFunc: (field: string) => (context: object) => (params: object) => bool)
- Add custom rule
- Add custom message