uniapp - uniCloud 云函数
目录
云函数
分类
客户端和云函数的通信
clientDB方式
云对象方式
云对象
云对象的Api
内置特殊方法
预处理 _before
后处理 _after
定时运行 _timing
云函数
概念
云函数是运行在云端的javascript代码,是基于Node.js的扩展
在Node API基础上,云函数环境内置了uniCloud对象,这个对象内置了网络、数据库等各种API。
每个云函数是一个js包,在云函数被调用时,由serverless调度系统分配硬件资源启动一个node环境来运行这个云函数。
每个云函数是一个目录,其中普通云函数有index.js入口文件,云对象的入口文件则是index.obj.js
注意事项
云函数内使用commonJs规范,不可使用import、export
不同项目使用同一个服务空间时,不可使用同名云函数,同名云函数会相互覆盖
阿里云版服务器,暂不支持使用相对路径读取文件,比如fs.readFileSync('./info.txt'),可以使用绝对路径fs.readFileSync(path.resolve(__dirname, './info.txt'))
分类
云函数有若干子概念,包括 普通云函数、云对象、公共模块、clientDB的action云函数、uniCloud扩展库
- 普通云函数——通过传统json接口方式和客户端通信,客户端使用uniCloud.callfunction("")调用云函数
- 云对象——通过前端导入对象来操作的,客户端使用uniCloud.importObject("")导入云对象
- 公共模块:用于不同的云函数/云对象,抽取和共享相同代码
- action云函数——为了弥补clientDB客户端直接操作数据库的局限而设计的。
- uncCloud扩展库——为了裁剪和控制云函数体积而设计的,避免增大每个云函数的体积。
|——— cloudfunctions 云函数目录 | │───common 云函数公用模块目录 详情 | | └──hello-common 云函数公用模块 | | │──index.js 公用模块代码 | | └──package.json 公用模块package.json | │───uni-clientDB-actions | │ └──new_action.js clientDB action代码 详情 | │───function-name 云函数目录 | │ │──index.js 云函数代码 | │ └──package.json 包含云函数的配置信息,如url化、定时设置、可用内存等内容 详情 | └───object-name 云对象目录 | │──index.obj.js 云对象代码 | └──package.json 包含云对象的配置信息,可用内存等内容 详情
客户端和云函数的通信
云函数是uniCloud的基础,本质上clientDB和云对象都是建立在云函数上针对特定场景的优化。
- clientDB针对的场景是数据库操作,它优化了可以不写或少写服务器代码。
- 云对象针对的场景是非数据库操作或不宜前端暴露的数据库操作时,和uni-app客户端的通信方式。它优化了代码结构,更精简、简单
clientDB方式
clientDB分API方式和组件方式
//API方式 客户端js直接操作云数据库,查询list表的数据。无需服务器代码
const db = uniCloud.database() // 获取云数据库的引用
db.collection('list').get().then((res)=>{// res 为数据库查询结果}).catch((err)=>{console.log(err); })
clientDB适用情况:
如果客户端使用uni-app开发,且向uniCloud服务空间的请求主要是为了操作云数据库(增删改查),那么推荐clientDB方式,由uni-app客户端直接操作云数据库。
如果操作数据库的同时,还需要同时执行一些云函数,可以使用clientDB的action云函数。
clientDB不适用的情况:
- 请求不操作云数据库,比如向外部web系统发送请求,操作redis、删除云文件等
- 操作的云数据库请求不希望暴露在前端
- 数据库表和字段数量多而接口数量少。给每个数据配置权限的工作量超过了控制少数接口权限的工作量
- 权限体系较复杂,除了用户和管理员外还有较多其他权限条件或动态权限。此时在schema和action中编写代码复杂度超过了写接口。
云对象方式
云对象和clientDB最大的区别,是云对象把数据库操作(以及其他逻辑)封装在云对象的方法里面。仍需在客户端和云端分别写代码,但应用场景不受限制,clientDB不适应的它都适应。
// 云端云对象代码,云对象名称:testco,有一个sum方法module.exports = {sum(a, b) {// 此处省略a和b的有效性校验return a + b}
}
//然后在客户端的js中,import这个testco对象,调用它的sum方法const testco = uniCloud.importObject('testco') //第一步导入云对象
async function sum () { //注意方法或生命周期需使用async异步方式try {const res = await testco.sum(1,2) //导入云对象后就可以直接调用该对象的方法了,注意使用异步awaitconsole.log(res) // 结果是3} catch (e) {console.log(e)}
}
云对象
背景:20年前,restful接口开发流行,服务器编写接口,客户端调用接口,传输json
现在:云对象,服务器编写API,客户端调用API,不再开发传输Json的接口,思路更清晰,代码更精简。
比如:服务端编写一个云对象todo,该对象有add、get、remove、update等方法。客户端的js则可以直接import这个todo云对象,直接调用add等方法
// 云对象名:todo
module.exports = {add(title, content) {title = title.trim()content = content.trim()if(!title || !content) {return {errCode: 'INVALID_TODO',errMsg: 'TODO标题或内容不可为空'}}// ...其他逻辑return {errCode: 0,errMsg: '创建成功'}}
}
// 然后在客户端的js中,import这个todo对象,调用它的add方法const todo = uniCloud.importObject('todo') //第一步导入云对象
async function addTodo () {try {const res = await todo.add('title demo', 'content demo') //导入云对象后就可以直接调用该对象的方法了,注意使用异步awaituni.showToast({title: '创建成功'})} catch (e) {// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误 uni.showModal({title: '创建失败',content: e.errMsg,showCancel: false})}
}
云对象的Api
简介@intro | uni-app官网
内置特殊方法
所有_
开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法
- _before
- _after
- _timing
预处理 _before
用于调用常规方法之前进行预处理,一般用于拦截器,统一的身份验证,参数校验等。
//疑问: this.getUniIdToken() 为null 不显示错误提示
module.exports = {_before: function(){const methodName = this.getMethodName()if(methodName === 'add' && !this.getUniIdToken()) {throw new Error('token不存在')}},add: function(title = '', content = '') {return {errCode: 0,errMsg: '创建成功'}}
}
后处理 _after
云对象内可以创建一个特殊的方法_after
用来再加工处理本次调用方法的返回结果或者抛出的错误
// todo/index.obj.js 没看出效果 T.T
module.exports = {_before: function(){this.startTime = Date.now() // 在before内记录开始时间并在this上挂载,以供后续流程使用},add: function(title = '', content = '') {if(title === 'abc') {throw new Error('abc不是一个合法的todo标题')}return {errCode: 0,errMsg: '创建成功'}},_after(error, result) {if(error) {throw error // 如果方法抛出错误,也直接抛出不处理}result.timeCost = Date.now() - this.startTimereturn result}
}
定时运行 _timing
uni-app官网
uniapp - uniCloud 云函数相关推荐
- 微信小程序调用unicloud云函数的方法
小程序中调用unicloud云函数 1. 必须设置小程序服务器域名 打开小程序服务器域名设置 设置request合法域名,多个网址用分号隔开,下方第一个为阿里云,第二个腾讯云. https://xxx ...
- 【翻译一下官方文档】邂逅uniCloud云函数(基础篇)
我将用图文的形式,把市面上优质的课程加以自己的理解,详细的把:创建一个uniCloud的应用,其中的每一步记录出来,方便大家写项目中,做到哪一步不会了,可以轻松翻看文章进行查阅.(此文长期更新连载) ...
- uni-app 结合云函数开发小程序博客(二):云函数实现登录注册
我们研发开源了一款基于 Git 进行技术实战教程写作的工具,我们图雀社区的所有教程都是用这款工具写作而成,欢迎 Star 哦 如果你想快速了解如何使用,欢迎阅读我们的 教程文档哦 本文由图雀社区认证作 ...
- uniCloud 云函数操作云数据库
uniCloud 云函数操作云数据库增删改查 前言 一.连接数据库拿到表集合 二.使用步骤 1.写入数据 2.引用doc() 2.1 修改数据方法一: doc.set() 2.2 修改数据方法二: d ...
- uniCloud 云函数操作云数据库-基础篇
uniCloud 云函数操作云数据库-基础篇 原文:uniCloud 云函数操作云数据库-基础篇 1. database() 获取数据库对象 const db = uniCloud.database( ...
- uni-app 结合云函数开发小程序博客(三):接入云函数,实现完善的列表刷新机制
我们研发开源了一款基于 Git 进行技术实战教程写作的工具,我们图雀社区的所有教程都是用这款工具写作而成,欢迎 Star 哦 如果你想快速了解如何使用,欢迎阅读我们的 教程文档哦 本文由图雀社区认证作 ...
- uniCloud 云函数
1本地云函数的创建和调用 1 创建uniapp项目 2 创建1个服务空间 https://unicloud.dcloud.net.cn/home 3 关联创建的云服务 cloudfunctions 存 ...
- uniCloud云函数 云对象简单使用
云对象简单使用 今天看了下文档 发现多了个 云对象 目前需要下载 3.4.0及以上版本 目前为 alpha版本 个人觉得云对象 让我们更加的能 贴近面向对象 https://www.dcloud.io ...
- uniapp uniCloud 云开发上传图片与查看图片
效果图: 1. 开通uniCloud 地址:https://unicloud.dcloud.net.cn 选择阿里云,需要实名认证. 2. 在uniCloud 的 web控制台创建服务空间,然后在云数 ...
最新文章
- 【cocos2d-x】瓷砖地图(TileMap)基础知识
- pkill mysql_每天一个linux命令:kill命令
- android 自定义actionbar,如何让android的actionbar浮动且透明
- Java的主要特性有哪些?
- netty发送对象消息
- eclipse linux c开发环境,Eclipse下搭建C/C++开发环境
- 修改SR4000自带软件,支持opencv
- mysql fulltext类型_mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的详细介绍(转)
- 图片服务器虚拟路径,springboot2.0图片上传至本地或服务器并配置虚拟路径的方法.pdf...
- 阿里巴巴CTO程立:双11的再进化
- font-family:常用中文字体的英文名称 (宋体 微软雅黑)
- 动态ActionForm
- linux终端清除命令,ubuntu清除命令行记录
- word在任意页开始添加页码
- 【转】photoshop CS2安装激活破解教程
- 【mongodb】连接报错Prematurely reached end of stream
- 金蝶K3线上采购价格审批生效系统开发
- 数据防泄露解决方案-智能制造
- 父爱动画代码python_python表白实现代码(可视化与动画版)
- 全球及中国双向可控硅输出光耦行业发展现状及项目战略规划分析报告2021-2027年版