koa-power-router v0.0.7
koa-power-router
Still under development!
Features:
onSTATUShandler (globally or per controller)beforeAction: a function list that runs before router action, if any of them return values exceptundefinedornullwill skip action, and go toonSTATUShandler
How to use
Install:
npm install --save koa-power-routerUsage:
var koa = require('koa')
var app = koa()
var router = require('koa-power-router/router')
var Controller = require('koa-power-router/controller')
var options = {
strictSlash: true // or false
}
app.use(router(options))
router.on('404', function* () {
yield this.render('404')
})
// Functions and Generators will auto-convert to Controller
router.get('/', function* (next) {
yield this.render('homepage')
yield next
})
// Define a Controller with beforeAction
var user = new Controller({
beforeAction: function () {
// if not login and token is empty
if (this.url.indexOf('/login') !== 0 &&
!this.cookies.get('token')) {
return true
}
},
login: function* () {
if (this.method === 'get') {
yield this.render('login')
} else {
doLogin()
}
},
dashboard: function* () {
yield this.render('dashboard')
},
on404: function* () {
yield this.render('user/404')
}
})
router.set('/login', ['get', 'post'], user.login)
router.get('/dashboard', user.dashboard)
router.on('404', function* () {
yield this.render('404')
})Router
Methods
router.configure(options)
app.use(router())
router.configure({})
// equals to
app.use(router({}))Supported options:
strictSlash
HTTP RFC 2396 defines path separator to be single slash.
However, unless you're using some kind of URL rewriting (in which case the rewriting rules may be affected by the number of slashes), the uri maps to a path on disk, but in (most?) modern operating systems (Linux/Unix, Windows), multiple path separators in a row do not have any special meaning, so /path/to/foo and /path//to////foo would eventually map to the same file.
http://stackoverflow.com/questions/10161177/url-with-multiple-forward-slashes-does-it-break-anything
If strictSlash is true, URL like //demo will not match the following router:
router.get('/demo', function () {})router.set(url, methods, action)
url: the pattern of URL, convertd to regular expression with path-to-regexp.
url supports:
- String:
'/homepage' - Named string:
'/uesr/:id' - Regular expression:
/^/item/(\d)+/i
methods: the HTTP methods that this router should support, can be string and array.
action: function or generator.
Shortcuts
router.all(url, action)router.get(url, action)router.post(url, action)router.put(url, action)router.delete(url, action)
router.on(status, handler)
Register a handler for specified status.
router.on('500', function* (next, error) {
yield this.render('500')
})With this feature, you can render error page without redirecting to an actual error page.
Controller
An exmaple of how to define a controller:
var user = new Controller({
beforeAction: function () {
if (!this.cookies.get('token')) {
return true
}
},
dashboard: function* () {
yield this.render('dashboard')
},
on404: function* (){
}
})Action
Same as the Koa middleware, nothing different.
dashboard: function* (next) {
yield this.render('dashboard')
yield next
}Methods
on(status, handler)
Register a handler for specified status.
user.on('500', function* () {
yield this.render('500')
})If a status is handled by a controller, router's handler will be skipped.
With this feature, you can render error page without redirecting to an actual error page.
Properties
beforeAction
A list of function that run before controller's action. For example:
ar user = new Controller({
beforeAction: function () {
if (!this.cookies.get('token')) {
this.status = 401
return true
}
},
dashboard: function* () {
yield this.render('dashboard')
},
on401: function* () {
yield this.render('user/not-authorized')
}
})
router.set('/login', ['get', 'post'], user.login)
router.get('/dashboard', user.dashboard)Any request of /dashboard without token will go to on401 handler and render user/not-authorized page instead dashboard page.
Yieldables
Power router uses yieldr to yield generatos and promises, you should notice that yieldr is slightly different from co.
If you really need some features that provided by co, use co directly:
var co = require('co')
router.get('/', function* () {
var result = yield co(function* () {
return yield [Promise.resolve('foo')]
})
console.log(result) // [ 'foo' ]
})Or:
router.get('/', function* () {
var result = [yield Promise.resolve('foo')]
console.log(result) // [ 'foo' ]
})Contributors
Via GitHub