koa2 原生路由实现

简单例子

  1. const Koa = require('koa')
  2. const app = new Koa()
  3. app.use( async ( ctx ) => {
  4. let url = ctx.request.url
  5. ctx.body = url
  6. })
  7. app.listen(3000)

访问 http://localhost:3000/hello/world 页面会输出 /hello/world,也就是说上下文的请求request对象中url之就是当前访问的路径名称,可以根据ctx.request.url 通过一定的判断或者正则匹配就可以定制出所需要的路由。

定制化的路由

demo源码

https://github.com/ChenShenhai/koa2-note/tree/master/demo/route-simple

源码文件目录

  1. .
  2. ├── index.js
  3. ├── package.json
  4. └── view
  5. ├── 404.html
  6. ├── index.html
  7. └── todo.html

demo源码

  1. const Koa = require('koa')
  2. const fs = require('fs')
  3. const app = new Koa()
  4. /**
  5. * 用Promise封装异步读取文件方法
  6. * @param {string} page html文件名称
  7. * @return {promise}
  8. */
  9. function render( page ) {
  10. return new Promise(( resolve, reject ) => {
  11. let viewUrl = `./view/${page}`
  12. fs.readFile(viewUrl, "binary", ( err, data ) => {
  13. if ( err ) {
  14. reject( err )
  15. } else {
  16. resolve( data )
  17. }
  18. })
  19. })
  20. }
  21. /**
  22. * 根据URL获取HTML内容
  23. * @param {string} url koa2上下文的url,ctx.url
  24. * @return {string} 获取HTML文件内容
  25. */
  26. async function route( url ) {
  27. let view = '404.html'
  28. switch ( url ) {
  29. case '/':
  30. view = 'index.html'
  31. break
  32. case '/index':
  33. view = 'index.html'
  34. break
  35. case '/todo':
  36. view = 'todo.html'
  37. break
  38. case '/404':
  39. view = '404.html'
  40. break
  41. default:
  42. break
  43. }
  44. let html = await render( view )
  45. return html
  46. }
  47. app.use( async ( ctx ) => {
  48. let url = ctx.request.url
  49. let html = await route( url )
  50. ctx.body = html
  51. })
  52. app.listen(3000)
  53. console.log('[demo] route-simple is starting at port 3000')

运行demo

执行运行脚本

  1. node -harmony index.js

运行效果如下

访问http://localhost:3000/index
route-result-01