uniCloud
是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。javascript
uniCloud
的 web控制台地址:unicloud.dcloud.net.cnphp
uniCloud
的 官方文档:github.com/dcloudio/un…html
从HBuilderX 2.5.8起支持。前端
开发和运行流程java
uniCloud.callFunction()
方法调用云函数。开发过程,链接DCloud服务器;运行过程是手机端直连阿里云或腾讯云 serverless 环境,不经过DCloud服务器中转。node
uniCloud 的底层环境,和微信小程序云开发、支付宝小程序云开发的基建环境相同。功能、性能、稳定性有足够的保障。腾讯云提供基础 serverless 能力,微信团队基于该能力封装了微信云开发,而DCloud团队基于该能力封装了 uniCloud。git
小程序云开发已蔚然成风,微信小程序、支付宝小程序、百度小程序均提供了云开发。微信公布已有50万以上的开发者在使用云开发了,微信本身的生活缴费、乘车码等大日活应用均使用云开发。不过这个流行技术一直没法跨端,它们都只支持各自的小程序。uniCloud
解决了跨端问题,让uni-app的全部端应用,均可以使用云开发这个利器。程序员
uniCloud 基建部分主要包括以下3部分:github
uniCloud
提供的安全机制下,能够实现应用前端直传CDN,避免服务器中转的耗时和带宽占用,且不会发生盗传。启用uniCloud
Hello uniCloud
项目模板,演示了各类云函数的使用。uniCloud云开发环境建立成功后,项目下会有一个带有云图标的特殊目录,名为“cloudfunctions”。web
项目环境建好后,须要为这个项目选择一个服务空间。若是开发者帐户没有实名认证,首先须要实名认证(这是法定要求,也是阿里云、腾讯云等云服务商的要求)。
一个开发者能够拥有多个服务空间,每一个服务空间都是一个独立的serverless云环境,不一样服务空间之间的云函数、数据库、存储都是隔离的。
服务空间和手机端项目是多对多绑定关系。同帐号下,一个项目能够关联到多个服务空间。一个服务空间也能够被多个项目访问。
cloudfunctions
右键菜单建立服务空间,会打开web控制台unicloud.dcloud.net.cn 进行建立cloudfunctions
点右键,菜单中点击选择云服务空间
,绑定你以前建立的服务空间。说明
uniCloud
项目建立并绑定服务空间后,开发者能够在cloudfunctions
目录右键建立云函数。
建立后会以云函数名称为名生成一个特殊目录,该目录下自动生成index.js,是该云函数的入口文件,不可更名。若是该云函数还须要引入其余js,可在index.js入口文件中引用。
注意
云函数的语法,是在普通的Node.js基础上补充了uniCloud的专用API。可参考API开发文档编写,也能够直接新建项目时选择hello uniCloud
模板体验。
HBuilderX为uniCloud开发提供了良好的语法提示和转到定义支持,对于代码中的API,选中并按下F1,也能够直接查看相应的文档。
以下为一个云函数示例
'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
const collection = db.collection('unicloud-test') // 获取表'unicloud-test'的集合对象
const res = await collection.limit(10).get() // 获取表中的10条数据,结果为json格式
return res // 返回json给客户端
};
复制代码
编写云函数后,在项目管理器里右键点击该云函数的目录,在弹出菜单中可选择“上传部署云函数”、“上传并运行测试云函数”。以下图所示:
前者仅完成部署,后者会在部署后同时运行,并打印日志出来。
在云函数编辑器里,按Ctrl+r
运行快捷键,或点工具栏的运行,还会直接看到上传并运行云函数的快捷指令。Ctrl+r
而后回车或选0
,便可高效的在控制台看到运行结果和日志输出。
云函数目前没法断点debug,只能打印console.log
看日志。
在uni-app的前端代码中,经过uniCloud.callFunction
方法调用云函数。详见callFunction文档
以下代码中,调用了名为test
的云函数,并发送了data
的json数据做为上行参数。
// promise方式
uniCloud.callFunction({
name: 'test',
data: { a: 1 }
})
.then(res => {});
// callback方式
uniCloud.callFunction({
name: 'test',
data: { a: 1 },
success(){},
fail(){},
complete(){}
});
复制代码
uni-app运行在各端,都可查看手机端日志。额外的,在App真机运行模式下,在HBuilderX的自带控制台也会打印云函数输出的console.log
。
App端真机调试输出云函很多天志,以下图所示
所执行云函数代码
'use strict';
exports.main = async (event, context) => {
console.log('------------');
console.log('云函很多天志输出');
console.log('------------');
return {
action: 'log demo'
}
};
复制代码
日志输出
目前uniCloud的web控制台还不能查看运行日志,后续会提供此功能。
各家小程序平台,均要求在小程序管理后台配置小程序应用的联网服务器域名,不然没法联网。
使用uniCloud后,开发者将再也不须要本身购买、备案域名,直接将uniCloud的域名填写在小程序管理后台便可。
根据下表,在小程序管理后台设置request合法域名、uploadFile合法域名(如没有上传文件业务,可不设置)。下表的域名均为阿里云或腾讯云自有域名,并不是DCloud所属域名。
服务提供商 | request合法域名 | uploadFile合法域名 |
---|---|---|
阿里云 | api.bspapp.com | bsppub.oss-cn-shanghai.aliyuncs.com |
小程序开发工具的真机预览功能,必须添加上述域名白名单,不然没法调用云函数。模拟器的PC端预览、真机调试不受此影响。
H5前端js访问云函数,涉及跨域问题,致使前端js没法链接云函数服务器。处理方式以下:。
cloudfunctions
目录右键可打开uniCloud后台)uniCloud后台配置安全域名:
H5前端页面部署问题
阿里云Serverless暂未支持H5前端页面部署,需开发者自行准备web服务器,在HBuilderX中点发行菜单,生成H5,将生成的前端文件部署在Nginx等web服务器下。
而后自行注册或使用已有域名,在域名服务商到处理好域名的解析,指向你的Nginx等服务器ip。
最后将该域名经过uniCloud后台配置为安全域名,便可在浏览器中访问。
m3w.cn二级域名申请
若为新冠抗疫需紧急上线H5,来不及注册域名,可申请使用DCloud提供的m3w.cn的二级域名,示例:hellounicloud.m3w.cn 。此时请使用你注册DCloud帐户的邮箱向service@dcloud.io发邮件申请,提供你的appid、计划使用的二级域名名称、解析的ip地址、应用的使用用途。
若是不发布H5,使用uniCloud不须要本身申请或准备域名。App和小程序里直接调用云函数便可。
自HBuilderX 2.5.11
起uniCloud
提供了db_init.json
来方便开发者快速进行数据库的初始化操做。
使用说明
cloudfucntions
目录右键便可建立db_init.json
,db_init.json
上右键初始化数据库。{
"collection_test": { // 集合(表名)
"data": [ // 数据
{
"_id": "da51bd8c5e37ac14099ea43a2505a1a5",
"name": "tom"
}
],
"index": [{ // 索引
"IndexName": "index_a", // 索引名称
"MgoKeySchema": { // 索引规则
"MgoIndexKeys": [{
"Name": "index", // 索引字段
"Direction": "1" // 索引方向,1:ASC-升序,-1:DESC-降序
}],
"MgoIsUnique": false // 索引是否惟一
}
}]
}
}
复制代码
一个服务空间对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。服务空间之间彼此隔离。
每一个服务空间都有一个全局惟一的space ID。将来会支持一个应用同时链接多个服务空间,届时须要在代码中声明space ID以告诉代码要链接哪一个云服务空间。
开发者可在 HBuilderX 中新建服务空间,以下:
或者在uniCloud的web控制台unicloud.dcloud.net.cn 建立服务空间。
开发者需先为项目绑定服务空间,而后才能上传云函数、操做服务空间下的数据库、存储等资源。
uniCloud
提供了一个 JSON 格式的文档型数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库能够有多个集合(至关于关系型数据中的表),集合可看作一个 JSON 数组,数组中的每一个对象就是一条记录,记录的格式是 JSON 对象。
关系型数据库和 JSON 文档型数据库的概念对应关系以下表:
关系型 | JSON 文档型 |
---|---|
数据库 database | 数据库 database |
表 table | 集合 collection |
行 row | 记录 record / doc |
列 column | 字段 field |
更多云数据库介绍参考规范。
云函数即在云端(服务器端)运行的函数。
开发者无需购买、搭建服务器,只需编写函数代码并部署到云端便可在客户端(App/H5/小程序等)调用,同时云函数之间也可互相调用。
一个云函数的写法与一个在本地定义的 JavaScript
方法无异,代码运行在云端 Node.js
中。当云函数被客户端调用时,定义的代码会被放在 Node.js
运行环境中执行。
开发者能够如在 Node.js
环境中使用 JavaScript
同样在云函数中进行网络请求等操做,并且还能够经过云函数服务端 SDK 搭配使用多种服务,好比使用云函数 SDK 中提供的数据库和存储 API 进行数据库和存储的操做,这部分可参考数据库和存储后端 API 文档。
开发者可在HBuiderX中,在cloudfunctions
目录上右键、新建云函数,以下:
云函数修改后,需上传到云端,方可生效。
更多云函数介绍参考规范。