更新记录

1.0.0.20200810(2020-08-10)

uni-koa 优化 取消自定义异常类 api-result-exception,整合到 listen 异常判断 新增 返回 api 统一数据格式方法,方便修改 优化 删除handle判断冗余代码使代码 uni-route 优化 删除 handle 判断冗余代码使代码 uni-jwt 优化 删除 verify 方法中返回 payload 中带有的签发时间(iat)和过期时间(exp)

1.0.0(2020-08-08)

云函数更新 https://gitee.com/dxj090/uni-koa.git

查看更多

云函数类插件通用教程

  1. 使用云函数类插件的前提是:使用HBuilderX 2.7+;已通过实名认证并开通了uniCloud。
  2. 如果下载的是完整项目,则需要在manifest.json的可视化界面获取appid。
  3. 需要对cloudfunctions目录点右键,绑定服务空间。如无服务空间,需先创建。建议在测试服务空间体验插件,避免对现网项目产生影响。
  4. 对cloudfunctions目录点右键上传所有云函数。在HBuilderX 2.7.8以前,如有common目录,还需单独对每个common目录下的公共模块上传。
  5. 如果cloudfunctions目录下有db_init.json,请点击右键,初始化云数据库。
  6. 通过以上步骤,完成uniCloud服务空间的初始化和云函数部署。然后就可以在HBuilderX的运行菜单里运行该项目,体验云端一体完整流程。

uniCloud 云函数 API 快速开发三剑客

uniCloud 是 DCloud 为开发者提供的基于 serverless 模式和 js 编程的云开发平台,云开发平台提供了云端(服务器端)运行的函数,代码是基于 node.js 环境运行的。

本文借鉴了 Node.js 中 web 开发框架 koa 的思想,针对 uniCloud 云函数特点构建开发 web api 框架(uni-koa)、路由(uni-router)和权限控制(uni-jwt)三者来 快速开发,方便扩展 我们在云端的应用服务,把 uni-koauni-routeruni-jwt 称之为 uniCloud云函数 API 快速开发三剑客

使用教程

下面以一个 用户登录 和 获取用户列表 api 为例

  1. uni-koa、uni-router和 uni-jwt 作为公用模块导入 cloudfunctions/common 目录并上传
  2. 使用cloudfunctions目录下的db_init.json初始化数据库
    {
    "code": 200,
    "data": [{
        "_id": "5f2a3360d90e5a0001d3d463",
        "avatar": "https://www.baidu.com/img/flexible/logo/pc/result.png",
        "phone": "13912334567",
        "role": "超级管理员",
        "username": "admin"
    }]
    }
  3. 新建用户应用 api 云函数,如:user-api,并在入口文件 index.js 中加入下列代码 :
"use strict"

//三剑客
const Koa = require("uni-koa")
const Router = require("uni-router")
const jwt = require("uni-jwt")

const SECRET_PWD = "PASSWORD 私钥,一般放在配置文件中统一管理"
const SECRET_JWT = "JWT 私钥,一般放在配置文件中统一管理"

const db = uniCloud.database()

exports.main = async (event, context) => {
    const app = new Koa()

    // 验证 api 路由
    app.use(jwt.koaJwt({ secret: SECRET_JWT }).unless({
        path: [/^\/user\/login/] // 登录api: /user/login 不验证
    }))

    const router = new Router({
        prefix: "/user" // 路由前缀
    })

    // {GET} /user/list 获取用户列表 api 测试
    router.get("/list", async (ctx, next) => {
        let res = await db.collection("admin_test").get()
        if (res.data.length > 0) {
            res.data.forEach(item => {
                delete item.password //密码一般不见人的
            })

            //成功时 返回数据到客户端并中断后面代码执行
            ctx.body = res.data 
        } else {
            //失败时 返回数据到客户端并中断后面代码执行
            ctx.throw(10000, "用户列表无数据!")
        }
    })

    // {GET} /user/login 登录获取token api 测试
    router.get("/login", async (ctx, next) => {
        let { username, password } = ctx.request.body
        //这里使用用户名和密码混合
        password = jwt.encrypt({ username, password }, SECRET_PWD)
        let res = await db.collection("admin_test").where({ username, password }).get()
        let userData = res.data[0]

        if (userData) {
            delete userData.password
            //生成token
            userData.token = jwt.sign(userData, SECRET_JWT, {
                expiresIn: 24 * 60 //过期时间单位分钟,缺省默认10分钟
            })

            ctx.body = userData
        } else {
            ctx.throw(10001, "你的用户名和密码不对!")
        }
    })

    // 启动 router
    app.use(router.routes())

    //执行 app 返回数据给客户端
    return app.listen(event, context)
}
  1. 用户登录测试 配置 运行测试参数 user-api.param.json

    {
    "url":"/user/login", 
    "method":"get",
    "data":{
        "username":"admin",
        "password":"123456"
    }
    }

    执行本地运行云函数 user-api 可以得到用户签证 token

  2. 获取用户列表测试 修改 运行测试参数 user-api.param.json

    {
    "url":"/user/list", 
    "method":"get",
    "header":{
        "authorization":"这里放置登录成功后得到的 token"
    }
    }

    执行本地运行云函数 user-api 可以得到用户列表

  3. 上传云函数和公共模块

几点注意事项

  1. 客户端请求数据是通过 uniCloud.callFunction 调用云函数, 如下所示
    uniCloud.callFunction({
    name: "user-aspi",              // 云函数名称
    data: {                         // 客户端需要传递的参数
        url: "/user/login",         // 请求 api 
        method: "get",              // 请求方法     
        header: {                   // 除请求登录 api 外其他都应带上token       
            authorization: "a.b.c"
        },
        data: {                     // 请求数据
            username: "admin",
            password: "123456"
        }
    }
    })
  2. API 采用 RESTful 风格 本框架中的请求方法只是个标识,主要用来规范我们 api 按 增/删/改/查 RESTful 风格来定义
请求方法 说明
post 添加操作
delete 删除操作
put 更新操作
get 查询操作(缺省)
  1. 上下文 ctx
名称 说明
ctx.url api 客户端请求路径
ctx.method 客户端请求方法:post/delete/put/get(默认)
ctx.status 状态码。200-成功,404-未找到资源,500-云端服务器异常,401-用户签证不可用
ctx.request.body 客户端请求数据,也就是第二个 data 数据
ctx.request.params 客户端动态路由请求数据,如:url:"user/3", 对应值 { id : 3 }
ctx.header.authorization 客户端请求时绑定的 token
ctx.body 成功时, 使用 ctx.body = 数据 , 返回格式: { code : 200, data : 数据 }
ctx.throw 失败时, 使用 ctx.throw( 状态码, 失败信息 ) , 返回格式: { code : 状态码, data : 失败信息 }
ctx.event 就是客户端调用云函数时传入的参数。
ctx.context 就是客户端调用的调用信息和运行状态,可以用它来了解服务运行的情况
  • 注意:由于我们数据不是发送到游览器,而是发送到客户端,因此使用 ctx.body 和 ctx.throw 后将中断后面的代码运行

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问