koa-mapperis a better and smart router middleware for koa. (Inspired bykoa-router)
- Support almost all features of
koa-router - Support for parameters validation
- Support parameters in
path,header,query,cookie - Support body parser
- Support request body validation
- Support coerce data types of parameters and body
- Support OpenAPI generation
npm install koa-mapperimport Koa from 'koa';
import logger from 'koa-logger';
import Mapper from 'koa-mapper';
const app = new Koa();
app.use(logger());
const mapper = new Mapper();
mapper.get('/users/:id', {
params: {
id: { type: 'number' },
info: { type: 'User', in: 'query' }
}
}, (ctx) => {
ctx.body = ctx.params;
});
mapper.post('/users', {
body: {
users: { type: 'array<User>' }
}
}, (ctx) => {
ctx.body = ctx.request.body;
});
mapper.define('User', {
id: { type: 'number', required: true },
name: { type: 'string', required: true }
});
app.use(mapper.routes());
app.use(mapper.allowedMethods());
app.listen(3000);
// open http://localhost:3000/users/123?info[id]=456&info[name]=hello
// open http://localhost:3000/openapi.jsonOptions
| Name | Type | Default | Description |
|---|---|---|---|
| prefix | string |
'' |
the path prefix for a Mapper |
| openURL | string or false |
/openapi.json |
OpenAPI route, false to disable OpenAPI |
| bodyparser | object or boolean |
false |
koa-body options, `true |
| throwParamsError | function or boolean |
utils.validateError |
Throw error for params invalid |
| throwBodyError | function or boolean |
utils.validateError |
Throw error for body invalid |
| validator | object |
{} |
ajv options |
| sensitive | boolean |
false |
sensitive option for path-to-regexp |
| strict | boolean |
false |
strict option for path-to-regexp |
type options = {
name: string, // route name, default null
prefix: string, // route prefix, default ''
bodyparser: object|boolean, // like Mapper options.bodyparser
throwParamsError: function, // like Mapper options.throwParamsError
throwBodyError: function, // like Mapper options.throwBodyError
params: Params, // OpenAPI parameters definition
body: Body, // OpenAPI requestBody schema definition
...others, // Fields of OpenAPI Operation Object
}More fields of Operation Object
type Params = {
in: string, // parameter in: `path`, `query`, `header`, `cookie`
type: string, // parameter type
...others, // Fields of OpenAPI Parameter Object
}More fields of OpenAPI Parameter Object
type support:
- Basic type:
array,boolean,integer,null,number,object,string,date,time,datetime,regex - Array type:
array<string>,array<number|string> - Custom type:
Pet,array<Pet>
type Body = string | {
[property]: Schema
}body examples:
body: 'Pet'=>body: { $ref: 'Pet' }body: { id: { type: 'number' } }=>body: { type: 'object', properties: { id: { type: 'number' } }}
mapper.schema('Tag', {
id: { type: 'integer', format: 'int64' },
name: { type: 'string' }
});
mapper.schema('Category', {
id: { type: 'integer', format: 'int64' },
name: { type: 'string' }
});
mapper.schema('Pet', {
id: { type: 'integer', format: 'int64' },
category: { type: 'Category' },
name: { type: 'string' },
photoUrls: { type: 'array<string>' },
tags: { type: 'array<Tag>' },
status: { type: 'string', enum: ['available', 'pending', 'sold'] }
}, {
required: ['name', 'photoUrls']
});Support type extends:
mapper.schema('Model', {
id: { type: 'number' },
createdAt: { type: 'datetime' },
updatedAt: { type: 'datetime' }
});
mapper.schema('User: Model', {
name: { type: 'string' }
});mapper.post('/users', {
body: 'User'
}, (ctx) => {
const { id, name } = ctx.request.body;
});Multipart and file upload:
mapper.post('/uploadImage', {
bodyparser: { multipart: true },
body: {
user: { type: 'number' },
image: { type: 'file' }
}
}, (ctx) => {
const { user, image } = ctx.request.body;
});MIT