uniCloud 云函数综述

简介

云函数是运行在云端的 JavaScript 代码,是基于 Node.js 的扩展。
在常规的 Node API 基础上,uniCloud的云函数环境内置了uniCloud对象,这个对象内置了网络、数据库等各种API。
每个云函数是一个js包,在云函数被调用时,由 serverless 调度系统分配硬件资源启动一个 node 环境来运行这个云函数。
每个云函数是一个目录,其中普通云函数有index.js入口文件,云对象的入口文件则是index.obj.js。
云函数启动后实例会保留一段时间(如15分钟),超过保留期后若该云函数一直没有被再调用,那这个实例会被释放。所以云函数有冷启动的概念。

注意事项

  • 云函数内使用commonjs规范,不可使用import、export
  • 不同项目使用同一个服务空间时,不可使用同名云函数。同名云函数会相互覆盖。
  • 在HBuilderX创建云函数时,如果新云函数与服务器上已存在同名云函数,会用新函数覆盖。所以应先选择从服务空间下载云函数。
  • 单个云函数大小限制为10M(包含node_modules),过大的云函数影响运行性能,也会增加计费的gbs。同时腾讯云支持在云端安装node_modules,此时不占用云函数体积。
  • uniCloud的阿里云版,暂不可使用相对路径读取文件(比如fs.readFileSync('./info.txt')),可以使用绝对路径fs.readFileSync(path.resolve(__dirname,'./info.txt'))

云函数分类

云函数有若干子概念,包括 普通云函数、云对象、公共模块、clientDB的action云函数、uniCloud扩展库。

  • 普通云函数:通过传统json接口方式和客户端通信,客户端使用uniCloud.callfunction("")调用云函数
  • 云对象:是通过前端导入对象来操作的,客户端使用uniCloud.importObject("")导入云对象。详见云对象
  • 公共模块:用于不同的云函数/云对象,抽取和共享相同代码
  • action云函数(不推荐使用):为了弥补clientDB客户端直接操作数据库的局限而设计的,从HBuilderX 3.6.11开始,推荐使用数据库触发器替代action云函数。
  • uniCloud扩展库:为了裁剪和控制云函数体积而设计的,一些不太常用的功能比如Redis,独立为可选扩展库,避免增大每个云函数的体积

客户端和云函数的通信

uniCloud体系里,客户端和服务端的云函数通信,有4种方式:


客户端和云函数通信.png

clientDB针对的场景是数据库操作,它优化了可以不写或少写服务器代码
云对象针对的场景是非数据库操作或不宜前端暴露的数据库操作时,和uni-app客户端的通信方式。它优化了代码结构,更精简、简单

uniCloud API列表

云函数支持 js 和 nodejs 的标准API,如console.log()、setTimeout(),除了标准API外,云函数环境中内置了uniCloud对象,扩展了一批新API,实际开发中更常用的是uniCloud的扩展API。见下:


API列表.png

扩展库

开发者可以对云函数目录点右键,管理公共模块和扩展库依赖,在其中选择要加载的扩展库。这个可视化界面对应的数据在云函数目录下的 package.json 内的extensions字段下。

目前支持的扩展库如下
○ JQL扩展库[uni-cloud-jql]:用于在云函数内使用JQL语法操作数据库
○ redis扩展库[uni-cloud-redis]:云函数内使用redis
○ 发送短信扩展[uni-cloud-sms]:云函数中发送短信
○ 一键登录API扩展[uni-cloud-verify]:手机App调用运营商一键登录服务时,云函数中获取到真实手机号
○ 统一推送服务扩展库[uni-cloud-push]:云函数内使用uni-push

比如:开启了redis扩展库的云函数package.json示例

{
  "name": "add-article",
  "version": "1.0.0",
  "description": "新增文章",
  "main": "index.js",
    "extensions": {
        "uni-cloud-redis": {} // 配置为空对象即可,后续如有扩展参数会在此处配置
    }
}

公共模块

云函数支持公共模块。多个云函数/云对象的共享部分,可以抽离为公共模块,然后被多个云函数引用。

创建并引入公用模块
在uniCloud/cloudfunctions/common右键新建公共模块(本例中为hello-common),会自动创建入口index.js文件和package.json文件。

// common/hello-common/index.js
function getVersion() {
  return '0.0.1'
}
module.exports = {
  getVersion,
  secret: 'your secret'
}

在hello-common右键上传公共模块到云端。
在要引入共用模块的云函数/云对象目录(本例为use-common)右键管理本云函数的扩展库/公共模块依赖,选择需要的公共模块确定。

// use-common/index.js
'use strict';
const {
  secret,
  getVersion
} = require('hello-common')
exports.main = async (event, context) => {
  let version = getVersion()
  return {
    secret,
    version
  }
}

云函数/云对象中使用jql

HBuilderX 3.4起,新建云函数/云对象,默认加载uni-cloud-jql扩展库。
使用uniCloud.databaseForJQL方法,可以得到一个JQL数据库操作对象。

云函数中使用

exports.main = async (event, context) => {
    const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传
        event,
        context 
    })
    const bookQueryRes = await dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作
    return {
        bookQueryRes
    }
};

云对象中使用
云对象中无法获取event和context,为方便在云对象中使用jql扩展,自HBuilderX 3.4.10起,uniCloud.databaseForJQL方法接收云对象clientInfo作为参数

module.exports = {
    addTodo (title, content) {
        const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo
            clientInfo: this.getClientInfo()
        })
    }
}

与clientDB的差异
虽然都使用 JQL,但云端和客户端还是有一点区别

clientDB无论如何不可访问password类型字段,不管schema的权限如何,这类数据不传输到客户端。云函数内可以访问password类型字段,但受schema配置的权限约束。
clientDB有action云函数的概念,为了弥补客户端操作数据库的不足。云函数没有再使用action的必要了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容