koa-architect
About
Reads a folder with middleware and routes and reduces routes to middleware using koa-mount and koa-trie-router.
That eventually allows you run your app extremely simple:
const Koa = require('koa')
const architect = require('koa-architect')
let app = new Koa()
for(let middleware of architect.readMiddlewareAndRoutes('./middleware')) {
app.use(middleware)
}
All of you need is keep in mind next things:
- each your file should returns a middleware or routes
- if it returns middleware then it will be pushed to the middleware stack
- if it returns routes then they will be reduced to middleware using a router
How does exactly your routes will be reduced to middleware?
exports.use = function (ctx) {
}
exports.get = {
'index': function (ctx) {
}
}
exports.post = {
'foo': function (ctx) {
},
'bar/:id': function (ctx) {
}
}
Package managers
NPM
-
Describe your package.json file:
{
"name": "your-app-name",
"dependencies": {
"koa-architect": "git+ssh://git@gitlab.element-studio.ru:npm/koa-architect.git#latest"
}
}
-
Execute in terminal:
npm install
Example
Assume, we have next folder tree and code:
middleware/
middleware/01-foo/
middleware/01-foo/index.js
middleware/02-bar/
middleware/02-bar/index.js
middleware/route/
middleware/route/index.js
middleware/nested/
middleware/nested/index.js
middleware/nested/middleware/
middleware/nested/middleware/index/
middleware/nested/middleware/index/index.js
middleware/nested/middleware/baz/
middleware/nested/middleware/baz/index.js
middleware/01-foo/index.js
module.exports = function (ctx, next) {
ctx.state.foo = 1
return next()
}
middleware/02-bar/index.js
module.exports = function (ctx, next) {
ctx.state.bar = 1
return next()
}
middleware/route/index.js
exports.get = {
'index': function (ctx) {
ctx.response.body = ctx.state
}
}
exports.post = {
'test/:id': function (ctx) {
ctx.response.body = ctx.params.id
}
}
middleware/nested/index.js
const path = require('path')
const architect = require('koa-architect')
exports.use = architect.readMiddlewareAndRoutes(path.join(__dirname, './middleware'))
middleware/nested/middleware/index/index.js
exports.use = function (ctx) {
ctx.response.body = ctx.originalUrl
}
middleware/nested/middleware/baz/index.js
exports.get = {
'index': function (ctx) {
ctx.response.body = ctx.originalUrl
}
}
And we launch our app using this way:
const Koa = require('koa')
const architect = require('koa-architect')
let app = new Koa()
for(let middleware of architect.readMiddlewareAndRoutes('./middleware')) {
app.use(middleware)
}
Thus we will get a server which handle requests next way:
GET --> /
GET <-- 404 "Not Found"
GET --> /route
GET <-- 200 {"foo":1,"bar":1}
POST --> /route/test/1
POST <-- 200 "1"
GET --> /nested
GET <-- 200 "/nested"
GET --> /nested/baz
GET <-- 200 "/nested/baz"
See test/fixtures for details.