From 8c0e405219ba32bda9b4f2057fc3e4a45c313975 Mon Sep 17 00:00:00 2001 From: tobewhatwewant Date: Sun, 16 Dec 2018 14:44:05 +0800 Subject: [PATCH] :sparkels:(return body): async validate, return validated body --- package.json | 4 ++-- src/index.ts | 28 ++++++++++++++++++---------- test/index.spec.ts | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 716cfb8..d1b6094 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@koex/validate", - "version": "0.0.1", + "version": "0.0.2", "description": "validate for koa extend", "main": "lib/index.js", "module": "lib/index.js", @@ -15,11 +15,11 @@ "prepublish": "npm run build" }, "devDependencies": { + "@koex/router": "^0.0.2", "@types/koa": "^2.0.47", "@types/mocha": "^5.2.5", "@types/node": "^10.9.4", "@zcorky/koa-onerror": "^0.0.1", - "@koex/router": "^0.0.1", "coveralls": "^3.0.2", "husky": "^1.2.0", "koa": "^2.6.2", diff --git a/src/index.ts b/src/index.ts index 1ab9b01..58a79f0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ declare module 'koa' { * * validate(rules, data); */ - validate: (rules: R, data?: D) => void; + validate: (rules: R, data?: D) => Promise; } } @@ -57,16 +57,24 @@ export interface Options { export default (options?: Options): Middleware => { const validator = new Parameter(options); - return async function koaEjs(ctx: Context, next: () => Promise) { - if (!ctx.validate) { - ctx.validate = (rules, data) => { - const _data = data || (ctx.request as any).body; - const errors = validator.validate(rules, _data); + const validateFn = async (ctx: Context, rules: R, data?: D) => { + const _data: D = data || (ctx.request as any).body; + const errors = validator.validate(rules, _data); + + if (errors) { + ctx.throw(422, 'Validation Failed', { + code: 'invalid_param', + errors, + }); + } - ctx.throw(422, 'Validation Failed', { - code: 'invalid_param', - errors, - }); + return _data; + }; + + return async function validate(ctx: Context, next: () => Promise) { + if (!ctx.validate) { + ctx.validate = async (rules: R, data?: D) => { + return validateFn(ctx, rules, data); }; } diff --git a/test/index.spec.ts b/test/index.spec.ts index 56ed6c3..57af9dc 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -18,7 +18,7 @@ describe('koa validate', () => { app.use(validate()); app.use(router.post('/', async (ctx, next) => { - ctx.validate({ + await ctx.validate({ name: 'string', age: 'int', }); @@ -31,7 +31,7 @@ describe('koa validate', () => { return request(app.listen()) .post('/') .send({ name: 'name', age: 22 }) - .expect(422); + .expect(200); }); it('should 422', () => { @@ -44,7 +44,7 @@ describe('koa validate', () => { app.use(validate()); app.use(router.post('/', async (ctx, next) => { - ctx.validate({ + await ctx.validate({ name: 'string', age: 'int', }); @@ -59,4 +59,33 @@ describe('koa validate', () => { .send({ name: 'name', age: '22' }) .expect(422, { message: 'Validation Failed' }); }); + + it('return body', () => { + const app = new Koa(); + app.use(onerror({ + log: () => null, + })); + app.use(bodyParser()); + app.use(validate()); + + app.use(router.post('/', async (ctx) => { + const { name, age } = await ctx.validate({ + name: 'string', + age: 'int', + }); + + ctx.body = { + name, + age, + }; + })); + + return request(app.listen()) + .post('/') + .send({ name: 'name', age: 22 }) + .expect(200, { name: 'name', age: 22 }); + }); });