返回顶部
首页 > 资讯 > 前端开发 > node.js >KOA2中Restful方式路由的示例分析
  • 569
分享到

KOA2中Restful方式路由的示例分析

2024-04-02 19:04:59 569人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关KOA2中Restful方式路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。API库结构考虑到全部对象置于顶层将会造成对象名越来长

这篇文章将为大家详细讲解有关KOA2中Restful方式路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

API库结构

考虑到全部对象置于顶层将会造成对象名越来长,同时不便于维护,故采取部分的分层结构

如workflow模块内的prototypes,instances等等,分层的深度定义为层级

可访问的对象集合(collection)的属性满足Restful设计

 -- workflow(cateGory)
  -- prototypes(collection)
    -- [method] ...
    -- [method] ... 
  -- instances(collection)
 -- users(collection)
   --[method] List     #get :object/
   --[method] Instance   #get :object/:id
 -- ...
 -- ...

RESTFUL API 接口

将Restful api接口进行标准化命名

.get('/', ctx=>{ctx.error('路径匹配失败')})        
.get('/:object', RestfulAPIMethods.List)
.get('/:object/:id', RestfulAPIMethods.Get)
.post('/:object', RestfulAPIMethods.Post)
.put('/:object/:id', RestfulAPIMethods.Replace)
.patch('/:object/:id', RestfulAPIMethods.Patch)
.delete('/:object/:id', RestfulAPIMethods.Delete)
.get('/:object/:id/:related', RestfulAPIMethods.Related)
.post('/:object/:id/:related', RestfulAPIMethods.AddRelated)
.delete('/:object/:id/:related/:relatedId', RestfulAPIMethods.DelRelated)

API对象

这个文件是来自微信小程序demo,觉得很方便就拿来用了,放于需要引用的根目录,引用后直接获得文件目录结构API对象

const _ = require('lodash')
const fs = require('fs')
const path = require('path')


const mapDir = d => {
  const tree = {}

  // 获得当前文件夹下的所有的文件夹和文件
  const [dirs, files] = _(fs.readdirSync(d)).partition(p => fs.statSync(path.join(d, p)).isDirectory())

  // 映射文件夹
  dirs.forEach(dir => {
    tree[dir] = mapDir(path.join(d, dir))
  })

  // 映射文件
  files.forEach(file => {
    if (path.extname(file) === '.js') {
      tree[path.basename(file, '.js')] = require(path.join(d, file))
      tree[path.basename(file, '.js')].isCollection = true
    }
  })

  return tree
}



// 默认导出当前文件夹下的映射
module.exports = mapDir(path.join(__dirname))

koa-router分层路由的实现

创建多层路由及其传递关系

执行顺序为

 1 -- 路径匹配
    -- 匹配到‘/'结束
    -- 匹配到对应的RestfulAPI执行并结束
    -- 继续
 2 -- 传递中间件 Nest
 3 -- 下一级路由
 4 -- 循环 to 1

const DefinedRouterDepth = 2
let routers = []
for (let i = 0; i < DefinedRouterDepth; i++) {
  let route = require('koa-router')()
  if (i == DefinedRouterDepth - 1) {
    // 嵌套路由中间件
    route.use(async (ctx, next) => {
      // 根据版本号选择库
      let apiVersion = ctx.headers['api-version']
      ctx.debug(`------- (API版本 [${apiVersion}]) --=-------`)
       if (!apiVersion) {
        ctx.error('版本号未标记')
        return
      }
      let APIRoot = null
      try {
        APIRoot = require(`../restful/${apiVersion}`)
      } catch (e) {
        ctx.error ('API不存在,请检查Header中的版本号')
        return
      }
      ctx.debug(APIRoot)
      ctx.apiRoot = APIRoot
      ctx.debug('---------------------------------------------')
      // for(let i=0;i<)
      await next()
    })
  }
  route
    .get('/', ctx=>{ctx.error('路径匹配失败')})
    .get('/:object', RestfulAPIMethods.List)
    .get('/:object/:id', RestfulAPIMethods.Get)
    .post('/:object', RestfulAPIMethods.Post)
    .put('/:object/:id', RestfulAPIMethods.Replace)
    .patch('/:object/:id', RestfulAPIMethods.Patch)
    .delete('/:object/:id', RestfulAPIMethods.Delete)
    .get('/:object/:id/:related', RestfulAPIMethods.Related)
    .post('/:object/:id/:related', RestfulAPIMethods.AddRelated)
    .delete('/:object/:id/:related/:relatedId', RestfulAPIMethods.DelRelated)


  if (i != 0) {
    route.use('/:object', Nest, routers[i - 1].routes())
  }
  routers.push(route)
}
let = router = routers[routers.length - 1]

Nest中间件

将ctx.apiObject设置为当前层的API对象

const Nest= async (ctx, next) => {
  let object = ctx.params.object
  let apiObject = ctx.apiObject || ctx.apiRoot
  if(!apiObject){
    ctx.error('API装载异常')
    return
  }

  if (apiObject[object]) {
    ctx.debug(`ctx.apiObject=>ctx.apiObject[object]`)
    ctx.debug(apiObject[object])
    ctx.debug(`------------------------------------`)
    ctx.apiObject = apiObject[object]
  } else {
    ctx.error(`API接口${object}不存在`)
    return
  }


  await next()
}

RestfulAPIMethods

let RestfulAPIMethods = {}
let Methods = ['List', 'Get', 'Post', 'Replace', 'Patch', 'Delete', 'Related', 'AddRelated', 'DelRelated']
for (let i = 0; i < Methods.length; i++) {
  let v = Methods[i]
  RestfulAPIMethods[v] = async function (ctx, next) {
    
    let apiObject = ctx.apiObject || ctx.apiRoot
    if (!apiObject) {
      ctx.error ('API装载异常')
      return
    }
    let object = ctx.params.object
    if (apiObject[object] && apiObject[object].isCollection) {
      ctx.debug(` --- Restful API [${v}] 调用--- `)
      if (typeof apiObject[object][v] == 'function') {
        ctx.state.data = await apiObject[object][v](ctx)
        ctx.debug('路由结束')
        return
        //ctx.debug(ctx.state.data)
      } else {
        ctx.error(`对象${object}不存在操作${v}`)
        return
      }
    }
    ctx.debug(` --- 当前对象${object}并不是可访问对象 --- `)
    await next()
  }
}

需要注意的点

1、koa-router的调用顺序
2、涉及到async注意next()需要加await

关于“KOA2中Restful方式路由的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: KOA2中Restful方式路由的示例分析

本文链接: https://www.lsjlt.com/news/76578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • KOA2中Restful方式路由的示例分析
    这篇文章将为大家详细讲解有关KOA2中Restful方式路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。API库结构考虑到全部对象置于顶层将会造成对象名越来长...
    99+
    2024-04-02
  • Vue3中路由和路由配置方式的示例分析
    这篇文章给大家分享的是有关Vue3中路由和路由配置方式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。路由的基本配置安装插件npm install vue-router@next&nb...
    99+
    2023-06-22
  • Angular中路由的示例分析
    这篇文章将为大家详细讲解有关Angular中路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 摘要简单来说地址栏中,不同的地址(URL)对应不同的页面,这...
    99+
    2024-04-02
  • vue-router路由模式的示例分析
    这篇文章将为大家详细讲解有关vue-router路由模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、路由模式解析要讲vue-router的路由模式,首先要...
    99+
    2024-04-02
  • Angular中Route路由的示例分析
    这篇文章主要介绍Angular中Route路由的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Angular 路由(Route)我们可以将路由器理解成控制整个应用状态的视图对象, 每个应用都有一个路由器; 路...
    99+
    2023-06-14
  • Vue中路由跳转的示例分析
    这篇文章给大家分享的是有关Vue中路由跳转的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近项目上需要用Vue用来做app,在Vue中使用路由时遇到下面的问题。路由设置...
    99+
    2024-04-02
  • AngularJs中ui-router路由的示例分析
    这篇文章主要介绍了AngularJs中ui-router路由的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ui-router$ur...
    99+
    2024-04-02
  • vue中静态路由的示例分析
    这篇文章将为大家详细讲解有关vue中静态路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路...
    99+
    2024-04-02
  • vue-router路由的示例分析
    这篇文章将为大家详细讲解有关vue-router路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。官方文档:旧版:https://github.com/vuej...
    99+
    2024-04-02
  • RabbitMQ路由方式实例代码分析
    这篇文章主要讲解了“RabbitMQ路由方式实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“RabbitMQ路由方式实例代码分析”吧!SpringBoot RabbitMQ 路由方...
    99+
    2023-06-26
  • vue-router命名路由和编程式路由传参的示例分析
    这篇文章主要介绍vue-router命名路由和编程式路由传参的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个...
    99+
    2024-04-02
  • Angular2中路由与导航的示例分析
    这篇文章主要为大家展示了“Angular2中路由与导航的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular2中路由与导航的示例分析”这篇文章吧...
    99+
    2024-04-02
  • Angular中路由和表单的示例分析
    这篇文章主要介绍Angular中路由和表单的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Angular的路由介绍在单页面应用中,需要在定义好的不同视图中(组件)来回切换,而...
    99+
    2024-04-02
  • vue中VueRouter路由基础的示例分析
    这篇文章主要介绍vue中VueRouter路由基础的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、VueRouter1、说明用 Vue.js + Vue Router 创建单页应用,感觉很自然:使用 Vu...
    99+
    2023-06-22
  • Angular4路由设置的示例分析
    这篇文章主要介绍Angular4路由设置的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.路由相关配置路由类设置 import { RouterMo...
    99+
    2024-04-02
  • Angular 4.x路由的示例分析
    这篇文章给大家分享的是有关Angular 4.x路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Installing the router首先第一件事,我们需要安装 ...
    99+
    2024-04-02
  • nodejs中Express与Koa2对比的示例分析
    这篇文章给大家分享的是有关nodejs中Express与Koa2对比的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、先说结论目前没有看到Express会被koa2取代...
    99+
    2024-04-02
  • WPF中隧道路由和冒泡路由事件的示例分析
    这篇文章主要介绍了WPF中隧道路由和冒泡路由事件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由...
    99+
    2023-06-14
  • vue中路由参数传递的示例分析
    这篇文章主要为大家展示了“vue中路由参数传递的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中路由参数传递的示例分析”这篇文章吧。首先我的路由的...
    99+
    2024-04-02
  • laravel中api路由auth:api和api_token的示例分析
    小编给大家分享一下laravel中api路由auth:api和api_token的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Laravel 是什么La...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作