Koa middleware for the validator module. Support v1 and v2.
npm install koa-middle-validator
constutil=require('util'),constKoa=require('koa');constbodyParser=require('koa-bodyparser');constconvert=require('koa-convert');constkoaValidator=require('koa-middle-validator');constRouter=require('koa-router');const_=require('lodash');constapp=newKoa();constrouter=newRouter();app.use(convert(bodyParser()));app.use(koaValidator({customValidators: {isArray: function(value){return_.isArray(value);},isAsyncTest: function(testparam){returnnewPromise(function(resolve,reject){setTimeout(function(){if(testparam==='42'){returnresolve();}reject();},200);});}},customSanitizers: {toTestSanitize: function(){return"!!!!";}}}));// this line must be immediately after any of the bodyParser middlewares!router.get(/\/test(\d+)/,validation);router.get('/:testparam?',validation);router.post('/:testparam?',validation);app.use(router.routes())app.use(router.allowedMethods({throw: true}))functionvalidation(ctx){ctx.checkBody('postparam','Invalid postparam').notEmpty().isInt();//ctx.checkParams('urlparam', 'Invalid urlparam').isAlpha();ctx.checkQuery('getparam','Invalid getparam').isInt();ctx.sanitizeBody('postparam').toBoolean();//ctx.sanitizeParams('urlparam').toBoolean();ctx.sanitizeQuery('getparam').toBoolean();ctx.sanitize('postparam').toBoolean();returnctx.getValidationResult().then(function(result){ctx.body={//}});}app.listen(8888);function(param,msg,value)
{ "validatorName": function(value, [additional arguments]), ... }
{ "sanitizerName": function(value, [additional arguments]), ... }
ctx.check('testparam','Error Message').notEmpty().isInt();ctx.check('testparam.child','Error Message').isInt();// find nested paramsctx.check(['testparam','child'],'Error Message').isInt();// find nested paramsAlias for ctx.check().
Alias for ctx.check().
Same as ctx.check(), but only looks in ctx.body.
Same as ctx.check(), but only looks in ctx.query.
Same as ctx.check(), but only looks in ctx.params.
Only checks ctx.headers. This method is not covered by the general ctx.check().
Only checks ctx.cookies. This method is not covered by the general ctx.check().
ctx.checkBody({'email': {optional: {options: {checkFalsy: true}// or: [{ checkFalsy: true }]},isEmail: {errorMessage: 'Invalid Email'}},'password': {notEmpty: true,matches: {options: ['example','i']// pass options to the validator with the options property as an array// options: [/example/i] // matches also accepts the full expression in the first parameter},errorMessage: 'Invalid Password'// Error message for the parameter},'name.first': {//optional: true,// won't validate if field is emptyisLength: {options: [{min: 2,max: 10}],errorMessage: 'Must be between 2 and 10 chars long'// Error message for the validator, takes precedent over parameter message},errorMessage: 'Invalid First Name'}});You can also define a specific location to validate against in the schema by adding in parameter as shown below:
ctx.check({'email': {in: 'query',notEmpty: true,isEmail: {errorMessage: 'Invalid Email'}}});ctx.check(schema); // will check 'password' no matter where it is but 'email' in query params
ctx.checkQuery(schema); // will check 'password' and 'email' in query params
ctx.checkBody(schema); // will check 'password' in body but 'email' in query params
ctx.checkParams(schema);
ctx.checkHeaders(schema); // will check 'password' in headers but 'email' in query params
Runs all validations and returns a validation result object for the errors gathered, for both sync and async validators.
ctx.assert('email','required').notEmpty();ctx.assert('email','valid email required').isEmail();ctx.assert('password','6 to 20 characters required').len(6,20);ctx.getValidationResult().then(function(result){// do something with the validation resultif(!errors.isEmpty()){ctx.body=errors.array();}else{// ctx.body = {};}});Runs all validations and return the validated values;
try{ctx.checkBody({})constvalues=awaitctx.getValidationLegalResult()mongoose.model.save(values)}catch(e){// $$emit error}ctx.checkBody('email').optional().isEmail();//if there is no error, ctx.request.body.email is either undefined or a valid mail.ctx.request.body.comment='a <span>comment</span>';ctx.request.body.username=' a user ';ctx.sanitize('comment').escape();// returns 'a <span>comment</span>'ctx.sanitize('username').trim();// returns 'a user'console.log(ctx.request.body.comment);// 'a <span>comment</span>'console.log(ctx.request.body.username);// 'a user'Alias for ctx.sanitize().
Same as ctx.sanitize(), but only looks in ctx.request.body.
Same as ctx.sanitize(), but only looks in ctx.request.query.
Same as ctx.sanitize(), but only looks in ctx.params.
Only sanitizes ctx.headers. This method is not covered by the general ctx.sanitize().
Only sanitizes ctx.cookies. This method is not covered by the general ctx.sanitize().
Runs all sanitizer and return the sanitized values;
try{ctx.sanitizeQuery('page').toInt()constvalues=awaitctx.getSanitizerLegalResult()mongoose.model.save(values)}catch(e){// $$emit error}