Skip to content

ngphi/koa-req-validator

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

koa-req-validator

NPM

Build Status

A node-validator based request validation middleware for Koa. Unlike other libraries, this middleware provides a declarative API and enables access to the full power of node-validator. Here is a taste of it:

router.post('/users', validate({
    email: ['require', 'isEmail', 'Invalid email address'],
    password: ['require', 'isLength(6, 32)', 'Password must be between 6 and 32 characters']
  }), function *(next) {
     ...
  }
)

// To validate properties of an object
router.post('/users', validate({
    'user.name': ['require', 'Name is required'],
    'user.address.state': ['require', 'State is required']
  }), function *(next) {
    ...
  }
)

Usage

Basic

import validate from 'koa-req-validator'

router.post(path, validate(opts), ...)

Options

opts is an object specifying the fields and their corresponding validation rules.

  • Each key is a field name in the post data (e.g. 'name', 'user.name') with optional search scopes: header (alias headers), query, body and params. Field name and scopes are separated by :. If no scope is specified, all scopes are searched.

  • Value is a rule array with the final element being an error message. A rule can be any of the supported methods of node-validator or a custom sync/async validator fn(value, ...args). Arguments can be provided, but make sure the omit the str argument (the first one) as it is automatically supplied by the middleware.

If a field has no value, it won't be validated. To make a field required, add the special required rule (or its alias isRequired). If there are validation failures, the middleware invokes ctx.throw() with status code 400 and all error messages.

Examples

import validator from 'validator'

// add custom validator
validator['isUserNameNew'] = async (username) => await db.Users.isNew(username)

validate({
  // Only find and validate email from request.body
  'email:body': ['require', 'isEmail', 'Invalid email address'],

  // Find password in all scopes, use the first non-empty value to validate
  'password': ['require', 'Password is required'],

  // Find and validate birthday from request.query or request.body
  'birthday:query:body': ['isDate', 'Invalid birthday'],

  // Check user name exist
  'username': ['isUserNameNew', 'Username already exists']
})

Route decorators

You can combine this middleware with route decorators, for example:

import validate from 'koa-req-validator'
import bodyParser from 'koa-bodyparser'

@controller('/users', convert(bodyParser()))
export default class extends Ctrl {

  @post('', validate(opts))
  async register(ctx, next) {
    ...
  }
}

Test

npm install
npm test

About

Declarative request validation middleware for Koa

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%