1.2.4 • Published 2 years ago

cmd-cloud-router v1.2.4

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

cmd-cloud-router

基于洋葱圈模型的云函数路由库,编写类 RESTful 资源路由

介绍

简易 koa 洋葱圈模型执行,koa-router 路由风格编写云函数。

  • 每个云函数是一个独立进程,使用路由分为多部分
  • 使用 path-to-regexp 函数库解析路由参数 /user/:str/:foo
  • 函数需要使用 nodejs12 版本以上, 中间件使用 Promise 函数。

函数-API

应用对象(Application)

Application 是请求级别的全局应用对象,监听云函数执行。基于洋葱圈模型,请求从第一个中间件开始并按其方式顺序运行。

函数名称说明
use注册使用中间件使用给定中间件加入程序执行过程
listen监听程序请求将云函数请求数据加入到应用程序对象

客户端调用云函数时传入的参数数据

参数说明
url必传参数,请求已定义的路由路径
method可选参数,路由路径指定的请求方法,默认GET方法
data可选参数,传入可能需要的参数数据

使用示例:

const { Application } = require("cmd-cloud-router");
const app = new Application();

// 使用中间件,请使用异步函数保证执行顺序
app.use(async (ctx, next) => {
    console.time("计时");

    let sum = 0;
    for (let i = 0; i < 99; i++) {
        for (let j = 0; j < i; j++) {
            sum += j;
        }
    }

    await next();

    // 响应结果要用 ctx.body
    ctx.body = `求和:${sum}`;

    console.timeEnd("计时");
});


// 客户端调用云函数时传入的参数
const event = {
    url: "/add",
    method: "post",
    data: {
        value: 99
    },
};

// 客户端调用云函数时的系统运行环境参数
const context = {
    text: "云函数请求环境",
    SOURCE: "云函数调用来源",
};

// 传入全局配置
const config = {
  name: "测试配置",
  value: "1.0.0",
};

// 对请求参数监听 返回Promise对象
app.listen(event, context, config).then(res => {
    console.log("响应ctx.body的结果:", res);
})
.catch(err => {
    console.log("错误结果:", err);
});

上下文 Context

Context 是请求级别的对象,封装了请求的信息,对每一次请求都会重新初始上下文参数属性。

请求上下文对象信息:

取值说明类型
event客户端调用云函数时传入的参数object
app客户端调用云函数时的系统运行环境参数object
url请求资源string
method请求方法string
data请求参数object
pathurl路径string
querystringurl查询字符串string
queryurl查询参数object
paramsurl路由参数object
body程序执行后通过该属性返回结果,函数内 return 是没有效果的object
config可选的传入全局配置参数object
*可选的中间件进行属性参数传递任意值

中间件 Middleware

Middleware 是请求级别的函数,在程序执行过程前或后加入处理逻辑,实现程序拦截过滤等功能。

module.exports = async (ctx, next) => {
  console.time("logger");
  // 定义属性参数
  ctx.logger = "日志中间件";
  // 中间件放行
  await next();
  console.timeEnd("logger");
};
  1. 如果没有触发next()函数,会终止程序并返回上下文 body 属性的结果。
  2. 确保执行结果符合洋葱模型,请使用 Promise 对象的函数。
  3. 上下文可以定义属性参数,数据生命周期只存在当前请求。

路由对象(Router)

Router 路由命名 URL 路由规则风格,支持 http 方法声明路由,可以只针对单个路由使用中间件,处理每一次请求。

函数名称说明
prefix路由前缀统一定义路由前缀
register注册路由创建并注册路由路径
getGET路由请求注册指定的get请求方法路由路径
postPOST路由请求注册指定的post请求方法路由路径
putPUT路由请求注册指定的put请求方法路由路径
deleteDELETE路由请求注册指定的delete请求方法路由路径
routes路由表中间件函数添加到应用对象中,执行请求匹配的路由函数

云函数调用来源为 timing 定时触发器会将 cron 表达式转换为 PUT 方法路由(hex 编码化)
转换例如 cron:0 0 * * * * => 63726f6e3a302030202a202a202a202a

使用示例:

const { Router } = require("cmd-cloud-router");
const router = new Router();

// 使用指定方法路由
// router.["get" | "post" | "put" | "delete"](<URL路径>, <函数>, <其他参数>);

router.post(
  "/index",
  async ctx => {
    ctx.body = "成功";
  }, {
    middleware:  [
      async (ctx, next) => {
        await next();
      },
    ]
  }
);

// 使用自定义方法路由
// router.register(<请求方法>, <URL路径>, <函数>, <其他参数>);

router.register(
  "post",
  "/index",
  async ctx => {
    ctx.body = "成功";
  }, {
    middleware:  [
      async (ctx, next) => {
        await next();
      },
    ]
  }
);

// 云函数调用来源为 timing 定时cron表达式转换路由 hex编码化
const cronPath = Buffer.from("cron:0 0 * * * *", "utf-8").toString("hex");
router.put(cronPath, async ctx => {
  console.log("执行 ==> %s - %s <==", ctx.method, ctx.path);
  // 定时任务没有需要响应的 ctx.body
});

// 注册到应用对象中间件中使用
// app.user(router.routes());

注解-API

  • 路由控制器:Controller
  • 路由方法:RequestMapping, Get, Post, Put, Del

将控制器声明的Class类文件进行扫描加入路由:ScanController

声明注解需要在编译环境下支持,已在使用 vite + ts 方式进行打包部署测试。

鸣谢

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago