Skip to content

Latest commit

 

History

History
247 lines (197 loc) · 5.37 KB

02.md

File metadata and controls

247 lines (197 loc) · 5.37 KB

09-14

Example 09-14

路由系统

/**
 * request文档
 * request.path 别名ctx.path
 * request.method 别名ctx.method
 * 
 * body上面放返回的数据, koa会从body上取, 然后返回给客户端
 * ==body 返回字符串: ctx.body=“hello, world"
 * ===    返回对象: ctx.body={key:1234}
 */
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next) => {
    console.log(ctx.method);
    console.log(ctx.path);
    if (ctx.path === '/get/name' && ctx.method === 'GET') {

        ctx.body = {
            key: 'Hello,world'
        }

    }

})
app.listen(3000)

多Router拆分路由

/**
 *书籍
 */
const Router = require('koa-router')

const router = new Router()

router.get('/v1/book/latest', async (ctx, next) => {
  ctx.body = {
    key: "book"
  }
})

module.exports = router
/**
 * 期刊
 */

const Router = require('koa-router')

const router = new Router()

router.get('/v1/classic/latest', async (ctx, next) => {
  ctx.body = {
    key: "classic"
  }
})
module.exports = router
/**
 * 多Router拆分路由
 * api都是有版本的
 * v1,v2,v3支持三个版本
 * 开闭原则:对修改关闭,对拓展开放
 * 版本号控制:
 * 1.路径里面            e.g '/v1/get/userinfo'
 * 2.查询字符串里面       e.g '/get/userinfo?version=v1'
 * 3.header             放到http header里面
 */
const Koa = require('koa')
const book = require('./api/v1/book')
const classic = require('./api/v1/classic')

const app = new Koa()

app.use(book.routes())
app.use(classic.routes())

app.listen(3000)

nodemon自动重启server

nodemon会在代码修改后,保存,自动重启server,很方便

# 全局安装nodemon
npm i nodemon -g

使用

# 在项目根目录下面 
nodemon app.js
nodemon example/app11.js

断点调试

  • 打断点
  • 按 F5 键 (执行到断点处,会暂停) 或者 点击 左侧工具栏的爬虫按钮 点击调试
  • 点击 左侧工具栏的爬虫按钮 点击调试 也可以添加配置文件

vscode+nodemon调试配置

点击 左侧工具栏的爬虫按钮 点击调试 也可以添加配置文件 ,然后新增一种
在当前文件启动调试
name是可以自定义的

{
      "type": "node",
      "request": "launch",
      "name": "启动当前文件",
      "program": "${file}"
    }

添加nodemon的启动

步骤

调试步骤

  • 点击左侧'爬虫'
  • 选择 nodemon
  • 点击左侧调试 绿色三角号

require-directory 实现路由自动加载

/**
 * require-directory 实现路由自动加载
 * //相对于 入口文件的所有的 模块
 * - const modules=requireDirectory(module) 
 * //会返回所有模块 包括不是路由的模块
 * - const modules = requireDirectory(module, './api/v1') 
 * //在visit 做过滤,只返回路由模块 .路由模块 导出的是module.exports=router .是Router的一个实例,所以可以通过判断 item instanceof Router 判断是不是一个路由
 * - const modules=requireDirectory(module,'./api/v1',{
 *      visit:()=>{
 *        if (item instanceof Router) {
             app.use(item.routes())
          }
 *     }
 * })
 */
const Koa = require('koa')
const Router = require('koa-router')
const requireDirectory = require('require-directory')

const app = new Koa()
// const modules=requireDirectory(module) 
// const modules = requireDirectory(module, './api/v1') //
const modules = requireDirectory(module, './api/v1', {
  visit: (item) => {
    if (item instanceof Router) {
      app.use(item.routes())
    }
  }
})

app.listen(3000)

提取初始化类方法

类的思想和类的静态方法的使用场景

/**
 * 初始化 路由
 *  类里面静态方法的好处,不需要实例化
 *  InitManager.app = app; //把app放到类上面,思想很重要。这样调用的时候,不需要传参数了
 *  const apiDirectory = `${process.cwd()}/app/api/v1` 用process.cwd()解决硬编码问题 
 */

const requireDirectoy = require('require-directory')
const Router = require('koa-router');


class InitManager {
  static init (app) {
    InitManager.app = app
    //注册路由
    InitManager.registerRouter()
  }
  static registerRouter () {
    const apiDirectory = `${process.cwd()}/app/api/v1`
    requireDirectoy(module, apiDirectory, {
      visit: (item) => {
        if (item instanceof Router) {
          InitManager.app.use(item.routes())
        }
      }
    })
  }
}

module.exports = InitManager

/**
 * 初始化 路由
 *  类里面静态方法的好处,不需要实例化
 *  InitManager.app = app; //把app放到类上面,思想很重要。这样调用的时候,不需要传参数了
 *  const apiDirectory = `${process.cwd()}/app/api/v1` 用process.cwd()解决硬编码问题 
 */

const requireDirectoy = require('require-directory')
const Router = require('koa-router');


class InitManager {
  static init (app) {
    InitManager.app = app
    //注册路由
    InitManager.registerRouter()
  }
  static registerRouter () {
    const apiDirectory = `${process.cwd()}/app/api/v1`
    requireDirectoy(module, apiDirectory, {
      visit: (item) => {
        if (item instanceof Router) {
          InitManager.app.use(item.routes())
        }
      }
    })
  }
}

module.exports = InitManager