5.0.2 • Published 22 days ago
validata-koa v5.0.2
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
5.0.2
22 days ago
5.0.1
2 years ago
4.0.14
3 years ago
4.0.10
3 years ago
4.0.11
3 years ago
4.0.13
3 years ago
4.0.9
3 years ago
4.0.8
3 years ago
4.0.7
3 years ago
4.0.6
3 years ago
4.0.5
3 years ago
4.0.4
3 years ago
4.0.3
3 years ago
4.0.2
3 years ago
4.0.1
3 years ago
3.0.3
4 years ago
3.0.2
4 years ago
3.0.1
4 years ago
2.0.20
4 years ago
2.0.19
4 years ago
2.0.18
4 years ago
2.0.17
4 years ago
2.0.16
4 years ago
2.0.15
4 years ago
2.0.14
4 years ago
2.0.13
4 years ago
2.0.12
4 years ago
2.0.11
4 years ago
2.0.10
4 years ago
2.0.9
4 years ago
2.0.8
4 years ago
2.0.5
4 years ago
2.0.4
4 years ago
2.0.7
4 years ago
2.0.6
4 years ago
2.0.3
4 years ago
2.0.2
4 years ago