Nearly Perpendicular Macaroons
Miss any of our Open RFC calls?Watch the recordings here! »

validata-koa

2.0.17 • Public • Published

Validata Koa

Type safe data validation and sanitization for Koa requests (body, query, headers, params) using validata.

See validata for more details on validation functionality.

Getting started

npm i validata validata-koa

Basic usage

Body checking

import * as Router from '@koa/router';
import * as Koa from 'koa';
import { Context } from 'koa';
import * as bodyParser from 'koa-bodyparser';
import { asNumber, isObject, isString, maybeString } from 'validata';
import validator from 'validator';
import { body, Statuses, validate } from 'validata-koa';
 
interface Body {
  age: number;
  email?: string;
  name: string;
}
 
const bodyCheck = isObject<Body>({
  age: asNumber({ min: 0, coerceMax: 120 }),
  email: maybeString({ validator: validator.isEmail }),
  name: isString(),
});
 
const app = new Koa();
app.use(bodyParser());
 
const router: Router = new Router();
// validate() middleware captures and formats validation issue responses
router.post('/:id', validate(), (ctx: Context) => {
  // these are now strongly typed
  // if age is passed in as a string, it will be converted to a number (by the asNumber() check)
  const { age, email, name } = body(ctx, bodyCheck);
  console.log({ age, email, name });
  ctx.status = Statuses.OK;
});
app.use(router.routes());
app.use(router.allowedMethods());
 
app.listen(8081);

Params and query parameters

import * as Router from '@koa/router';
import * as Koa from 'koa';
import { Context } from 'koa';
import { asNumber, isObject, isString, maybeAsNumber } from 'validata';
import { params, query, Statuses, validate } from 'validata-koa';
 
interface Params {
  id: number;
}
 
const paramsCheck = isObject<Params>({
  id: asNumber({ min: 0 }),
});
 
interface Query {
  filter: string;
  page?: number;
}
 
const queryCheck = isObject<Query>({
  filter: isString(),
  page: maybeAsNumber({ min: 0 }),
});
 
const app = new Koa();
const router: Router = new Router();
 
// validate() middleware captures and formats validation issue responses
router.post('/:id', validate(), (ctx: Context) => {
  // these are now strongly typed
  const { id } = params(ctx, paramsCheck);
  const { filter, page } = query(ctx, queryCheck);
 
  ctx.body = { id, filter, page };
  ctx.status = Statuses.OK;
});
app.use(router.routes());
app.use(router.allowedMethods());
 
app.listen(8081);

Testing it out...

curl -X POST localhost:8081/foo
# status=400 
# {"issues":[{"path":[":","id"],"value":"foo","reason":"no-conversion","info":{"toType":"number"}}]} 
 
curl -X POST localhost:8081/12
# status=400 
# {"issues":[{"path":["?","filter"],"reason":"not-defined"}]} 
 
curl -X POST localhost:8081/12?filter=test
# status=200 
# {"id":12,"filter":"test"} 
 
curl -X POST localhost:8081/-2?filter=test
# status=400 
# {"issues":[{"path":[":","id"],"value":-2,"reason":"min","info":{"min":0}}]} 

Headers

... can be done in pretty much the same way

Install

npm i validata-koa

DownloadsWeekly Downloads

284

Version

2.0.17

License

MIT

Unpacked Size

108 kB

Total Files

42

Last publish

Collaborators

  • avatar