app.use
注册路由const Koa = require('koa') const app = new Koa() // 引入koa-router并对其实例化 const router = require('koa-router')() // 配置get路由 router.get('/get', function (ctx, next) { ctx.body = 'this is a get response!' }) // 配置post路由 router.post('/post', function (ctx, next) { ctx.body = 'this is a post response!' }) // 注册路由 app.use(router.routes(), router.allowedMethods()) app.listen(8000) module.exports = app
请求后咱们能够看到结果:
GET:javascript
this is a get response!
POST:vue
this is a post response!
这是最基本的路由配置,虽然全部的路由均可以经过这样的方式配,可是在实际项目中,这样的代码后期会极其难以维护,咱们还有更优雅的方式去配置你的路由。java
koa-router
提供一种router.prefix
方法,此方法对于某一个
router来讲,是一个全局配置,此router的全部路径都会自动被添加该前缀。node
const Koa = require('koa') const app = new Koa() // 引入koa-router const router = require('koa-router') // 这两行代码等同于 const router1 = require('koa-router')() const router1 = new router() // 为router1配置路由前缀 router1.prefix('/pre') router1.get('/get', function (ctx, next) { ctx.body = 'this is a get1 response!' }) // router2不配置路由前缀 const router2 = new router() router2.get('/get', function (ctx, next) { ctx.body = 'this is a get2 response!' }) // 注册路由 app.use(router1.routes(), router1.allowedMethods()) app.use(router2.routes(), router2.allowedMethods()) app.listen(8000) module.exports = app
咱们用浏览器访问,发现get1的路由是/pre/get1
,get2的路由是/get2
:
localhost:8000/pre/getvue-router
this is a get1 response!
this is a get2 response!
使用router.use
方法,一样的可以为路由分层,而且不会由于忽略了prefix
的全局配置形成一些没必要要的失误,
推荐使用这一种方法为路由分层。浏览器
const Koa = require('koa') const app = new Koa() const router = require('koa-router') // 定义子路由 const router_children = new router() router_children.get('/get', function (ctx, next) { ctx.body = 'this is a get response from router.use!' }) // 根路由 const router_root = new router() // 在根路由中注册子路由 router_root.use('/root', router_children.routes(), router_children.allowedMethods()) // 在app中注册根路由 app.use(router_root.routes(), router_root.allowedMethods()) app.listen(8000) module.exports = app
浏览器访问localhost:8000/root/get:bash
this is a get response from router.use!
相似于vue-router,能够将参数直接以 /path/parma 的形式传递参数。
路由的param参数经过ctx.params获取。app
const Koa = require('koa') const app = new Koa() const koa_router = require('koa-router') const router = new koa_router() router.get('/:category/:page/:id', function (ctx, next) { ctx.body = ctx.params }) app.use(router.routes(), router.allowedMethods()) app.listen(8000) module.exports = app
浏览器访问localhost:8000/story/99/195c6f5b-2f71-4412-9634-bfd05f80c7c4:koa
{ "category": "story", "page": "99", "id": "195c6f5b-2f71-4412-9634-bfd05f80c7c4" }
当咱们的项目越作越大时,可能最终会有成百上千个路由,若是这些路由所有写在一个文件下面,对后期的维护将是一个极大的考验。
所以为了让咱们的代码具有高可维护性,可拓展性,咱们最好对路由进行切割并分层,咱们借助node.js
的fs
模块对文件操做可以很轻易的实现路由切割。
若是你对fs
模块还不太了解,请先自行学习此模块。
app.js:
const Koa = require('koa') const app = new Koa() const routes = require('./routes') app.use(routes.routes(), routes.allowedMethods()) app.listen(8000) module.exports = app
此段用来引入并注册routes文件夹下的index.js文件。
routes/index.js:
const router = require('koa-router')() const fs = require('fs') const path = require('path') const files = fs.readdirSync(__dirname) files .filter(file => ~file.search(/^[^\.].*\.js$/)) .forEach(file => { const file_name = file.substr(0, file.length - 3); const file_entity = require(path.join(__dirname, file)); if (file_name !== 'index') { router.use(`/${file_name}`, file_entity.routes(), file_entity.allowedMethods()) } }) module.exports = router
这一段代码特别关键,用来引入并注册全部同级目录下的js文件(此目录下的js文件都是路由文件),并为他们配上以文件名命名的层级前缀。
routes/demo.js:
const router = require('koa-router')() router.get('/', function (ctx, next) { ctx.body = 'demo' }) router.get('/child', function (ctx, next) { ctx.body = 'demo child' }) module.exports = router
这个就是业务的示例文件,没什么特别的。须要新增路由只须要新增此类文件便可。
经过浏览器进行访问测试
localhost:8000/demo/child:
demo child
demo
好了,路由已经被成功分割。