node.js、koa2开发微信小程序后端(二)

路由

const Koa = require('koa')

const app = new Koa() 

 app.use(async (ctx,next)=>{
    console.log(ctx.path)//request与ctx等效
    console.log(ctx.method)
    //路由
    if(ctx.path === "/classic/latest"&&ctx.method ==="GET"){
        ctx.body = {key:'classic'}
    } 
}) 

app.listen(3000)//端口号

运行代码之后,我们可以看到浏览器中出现json

{
    "key":"classic"
}

在大型项目中,使用if编写路由非常繁琐,因此我们可以采用第三方路由系统koa-router

koa-router使用步骤

  1. 实例化koa-router
  2. 编写一系列路由函数
  3. 调用app.use()注册中间件
const Koa = require('koa')
const Router = require('koa-router')//koa-router文档:koa-router npm
//根据数据类型划分主题
const app = new Koa() 
const router = new Router()
//第三方路由系统koa-router
router.get('/classic/latest',(ctx,next)=>{
    ctx.body = {key:'classic'}
})
//get查询 post新增 put更新 delete删除

app.use(router.routes())


app.listen(3000)//端口号

多router拆分路由

服务器api是需要考虑客户端兼容性,需要兼容多个版本。api请求需要携带版本号,方法如下:

  1. 加在路径中
  2. 加在查询参数中
  3. 加在herder中

在island目录下新建api文件夹,api文件夹下再新建文件夹v1用来存放v1版本的APIclassic.js和book.js

//app.js
const Koa = require('koa')
const classic = require('./api/v1/classic')
const book = require('./api/v1/book')

const app = new Koa() 

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


app.listen(3000)//端口号
//classic.js
const Router = require('koa-router')
const router = new Router()
router.get('/v1/classic/latest',(ctx,next)=>{
    ctx.body = {
    	key:'classic'
    }
})

module.exports = router
//book.js
const Router = require('koa-router')
const router = new Router()
router.get('/v1/book/latest',(ctx,next)=>{
    ctx.body = {
        key:'book'
    }
    
})
module.exports = router

通过在浏览器中输入http://localhost:3000/v1/book/latest和http://localhost:3000/v1/classic/latest即可获取不同路由的返回值

nodeserver自动重启

全局安装nodemon npm i nodemon -g

执行 nodemon app.js 即可实现代码修改后自动重启nodeserver

路由自动注册

//app.js
const Koa = require('koa')
const Router = require('koa-router')
const requireDirectory = require('require-directory')

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

app.listen(3000)//端口号

为了以后代码维护方便,我们可以将自动注册路由的代码放在初始化管理器中

//core/init.js
const Router = require('koa-router')
const requireDirectory = require('require-directory')

//初始化管理器
class InitManager{
    static initCore(app){
        //入口方法
        InitManager.app = app
        InitManager.initLoadRouters()//调用静态方法
    }
    static initLoadRouters(){
        //path config
        const apiDirectory = `${process.cwd()}/app/api`//ES6模板字符串  process.cwd获取根目录
        requireDirectory(module,apiDirectory,{
            visit:whenLoadModule
        })
        function whenLoadModule(obj){
            if(obj instanceof Router){
                InitManager.app.use(obj.routes())
            }
        }
    }
}
module.exports = InitManager

同时,也减少了app.js中的代码量

const Koa = require('koa')

const Initmanager = require('./core/init')

const app = new Koa() 

Initmanager.initCore(app)

app.listen(3001)//端口号

node.js、koa2开发微信小程序后端(二)_第1张图片

你可能感兴趣的:(后端)