Functions and promises can be used as middleware in koa.
const Koa = require('koa');
const adapter = require('koa-middleware-adapter');
const app = new Koa();
app.use(adapter.create(() => 'Hello, World!'));
const port = 4000;
app.listen(port, () => {
console.log(`server is listening to port ${port}`);
});
$ npm i koa-middleware-adapter
const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const adapter = require('koa-middleware-adapter');
const UserDao = require('./userDao');
const userDao = new UserDao();
async function findUserInfo(userId, userDao) {
const user = await userDao.findById(Number(userId));
if (!user) throw new adapter.NotFound('User Not Found');
return user;
}
async function createUserInfo(user, userDao) {
await userDao.insert(user);
return user;
}
const findUserMiddleware = adapter.create(findUserInfo, {
status: 200,
parameters: [
new adapter.parameter.Parameter(adapter.parameter.where.params, { name: 'id', index: 0 }),
new adapter.parameter.Parameter(userDao, { index: 1 }),
],
});
const findUserInContextMiddleware = adapter.create(findUserInfo, {
status: 200,
parameters: [
new adapter.parameter.Parameter(new adapter.parameter.where.Where('user', true), { name: 'id', index: 0 }),
new adapter.parameter.Parameter(userDao, { index: 1 }),
],
});
const createUserMiddleware = adapter.create(createUserInfo, {
status: null,
parameters: [
new adapter.parameter.Parameter(adapter.parameter.where.body, { index: 0 }),
new adapter.parameter.Parameter(userDao, { index: 1 }),
],
response: new adapter.response.Response(adapter.response.where.context, { name: 'user' }),
});
const router = new Router();
router.get('/users/:id', findUserMiddleware);
router.post('/user', createUserMiddleware, findUserInContextMiddleware);
const app = new Koa();
app.use(bodyParser());
app.use(router.routes());
app.use(router.allowedMethods());
const port = 4000;
app.listen(port, () => {
console.log(`server is listening to port ${port}`);
});
-
POST http://localhost:4000/user
{ "username": "test", "password": "test" }
-
status: 200
{ "username": "test", "password": "test", "id": 0 }
-
status: 200
{ "username": "test", "password": "test", "id": 0 }
adapter.create(listener, { status, type, parameters, response, handlers, thisArg });
function Parameter(
where = new Where(null, true, true, true),
options = {},
) {
this.where = where;
this.name = options.name || null;
this.as = options.as || null;
this.index = options.index || 0;
this.combineLevel = options.combineLevel || 0;
}
-
Parameters defines the information of the parameters to pass.
where
defines where to find the parameter.- If
where
is not an instance ofWhere
, the parameter iswhere
. - If
where
is an instance ofWhere
, the parameter is found inctx
with information fromwhere
.
- If
name
is the name of the parameter.- If
name
exists, the same name is taken from the parameter's location.
- If
combineLevel
is the level at which the imported arguments are to be combined.0
means the imported parameter is the parameter to pass.1
means the imported parameter is a child of the parameter to pass.
as
specifies a name when passing a parameter.index
is index of the parameter to pass.
-
The default value is
params
,query
,header
,body
,cookies
defined.
function Response(
where = new Where(null, true, true, true),
options = {},
) {
this.where = where;
this.name = options.name || null;
this.type = options.type;
}
- The response determines how to handle the lister's response
where
defines where to bind the response.- If
where
is not an instance ofWhere
, the response is injected inwhere
. - If
where
is an instance ofWhere
, the position is found inctx
with information fromwhere
and inject the response.
- If
name
is the name of the response.- If
name
exists, the same name is defined in the position to inject the response.
- If
- The default value is
body
, which binds the request value to the body of the response.
function Where(name, context, koa, node, setterAndGetter) {
this.name = name;
this.context = context;
this.koa = koa;
this.node = node;
this.setterAndGetter = setterAndGetter;
}
- Where defines where to find the parameter.
name
is the name of the location from which to retrieve the parameter.context
means to find the location of a parameter inctx
.koa
means to find the location of a parameter inctx.request
.node
means to find the location of a parameter inctx.req
.
setterAndGetter
means to useset
orget
method to extract or inject object, ifset
orget
method is exist.
const handlers = { extractParameterHandler, injectResponseHandler, errorHandler };
function extractParameterHandler(ctx, parameters) {}
function injectResponseHandler(ctx, result, options = { response, status, type }) {}
function errorHandler(ctx, error) {}
- If this is exist, listener call by thisArg.
- If this type is function, listener call by result of thisArg.