使用Koa搭建服务端程序API - 路由和控制器(二)

991 阅读3分钟

在上一篇文章中搭建了简单的http服务器并且成功在3000端口上运行成功,也编写了第一个路由。

路由的拆分

在一个成熟的项目中,我们不会把路由写在入口文件里面的,不利于以后的维护和管理。

在router文件夹里面新建一个index.js

开始编写我们的路由
const Router = require('koa-router')
const router = new Router()

router.get('/', ctx => {
  ctx.body = 'hello world'
})


//导出路由
module.exports = router


在入口文件中引入路由

const Koa = require('koa')
const app = new Koa() //实例化Koa
const body = require('koa-bodyparser')
const Router = require('koa-router')
const router = new Router() //实例化路由中间件

//引入路由
const IndexRouter = require('./routes/index.js')

//使用 koa-bodyparser中间
app.use(body())

app.use(IndexRouter.routes()).use(IndexRouter.allowedMethods())

//启动http服务 并在3000端口上运行
app.listen(3000, () => {
  console.log('service is running on port 3000')
})


接收GET参数

koa提供了ctx上下文对象,request和response都在ctx对象中

router.get('/a1', ctx => {
  const query = ctx.request.query
  ctx.body = query
})
  • ctx.request.query就是用来介绍get中的url参数的
  • ctx.request.query 也可以写成ctx.query

例如url是==http://127.0.0.1:3000/a1?id=123==那些query就是一个对象{id:123}

router.get('/a1/:id', ctx => {
  const query = ctx.request.query
  ctx.body = query
})

GET动态路由中接收参数

router.get('/a1/:id', ctx => {
  const query = ctx.params
  ctx.body = query
})
  • :id就是动态路由的参数名字
  • ctx.request.params 也可以写成ctx.params就是接收到的参数

例如url是==http://127.0.0.1:3000/a1/123==那些query就是一个对象{id:123}

接收POST参数

router.post('/a1', ctx => {
  ctx.body = ctx.request.body
})
  • ctx.request.body就是前端传过来的数据体

自动加载路由

我们只把routers文件夹里面的index.js作为整个路由的出口文件,不要每加一个路由文件就在app.js里面引入一次

routers/index.js

const fs = require("fs");
module.exports = app => {
  fs.readdirSync(__dirname).forEach(file => {
    if (file === "index.js" || /^\./.test(file)) {
      return;
    }
    const route = require(`./${file}`);
    app.use(route.routes()).use(route.allowedMethods());
  });
};

app.js

const Koa = require('koa')
const app = new Koa() //实例化Koa
const body = require('koa-bodyparser')


//引入路由
const routes = require('./routes/index.js')

//使用 koa-bodyparser中间
app.use(body())

//执行routes方法 把app传进去
routes(app);

//启动http服务 并在3000端口上运行
app.listen(3000, () => {
  console.log('service is running on port 3000')
})

我们具体拆分一下我们的工程,我们只想router只负责路由的功能,不负责处理逻辑,我们把逻辑的处理放进controller文件里面去

控制器

在routes文件里新建一个user.js文件处理我们关于用户操作的路由

routers/user.js

const router = require('koa-router')()

//给当前路由统一增加前缀
router.prefix('/v1/users')

//引入控制器里面的方法
const { login, update, create, getUserInfo } = require('../controller/user')

//用户登录路由
router.post('/login', login)

//增加一个user
router.post('/', create)

//修改user
router.patch('/:id', update)

//获取user信息
router.get('/:id', getUserInfo)

module.exports = router


controller文件夹里面见一个和路由对应的js文件,user.js,开始编写上面路由文件中对用的方法

controller/user.js

//关于登录逻辑的处理
function login(ctx{
  ctx.body = 'login'
}

//增加用户的逻辑处理
function create(ctx{
  ctx.body = 'create'
}

//修改用户的处理
function update(ctx{
  ctx.body = 'update'
}

//获取用户信息的处理
function getUserInfo(ctx{
  ctx.body = 'getUserInfo'
}

module.exports = {
  login,
  create,
  update,
  getUserInfo,
}

交个朋友吧~~

image