uniapp - uniCloud 云函数

这篇具有很好参考价值的文章主要介绍了uniapp - uniCloud 云函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

云函数

分类

客户端和云函数的通信 

clientDB方式

 云对象方式

云对象

 云对象的Api

 内置特殊方法

预处理   _before 

后处理    _after

定时运行    _timing


云函数

概念

云函数是运行在云端的javascript代码,是基于Node.js的扩展

在Node API基础上,云函数环境内置了uniCloud对象,这个对象内置了网络、数据库等各种API。

每个云函数是一个js包,在云函数被调用时,由serverless调度系统分配硬件资源启动一个node环境来运行这个云函数。

 每个云函数是一个目录,其中普通云函数有index.js入口文件,云对象的入口文件则是index.obj.js

注意事项

  1. 云函数内使用commonJs规范,不可使用import、export

  2. 不同项目使用同一个服务空间时,不可使用同名云函数,同名云函数会相互覆盖

  3. 阿里云版服务器,暂不支持使用相对路径读取文件,比如fs.readFileSync('./info.txt'),可以使用绝对路径fs.readFileSync(path.resolve(__dirname, './info.txt'))

分类

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

  1. 普通云函数——通过传统json接口方式和客户端通信,客户端使用uniCloud.callfunction("")调用云函数
  2. 云对象——通过前端导入对象来操作的,客户端使用uniCloud.importObject("")导入云对象
  3. 公共模块:用于不同的云函数/云对象,抽取和共享相同代码
  4. action云函数——为了弥补clientDB客户端直接操作数据库的局限而设计的。
  5. 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         包含云对象的配置信息,可用内存等内容 详情
	

客户端和云函数的通信 

uniapp - uniCloud 云函数

云函数是uniCloud的基础,本质上clientDB和云对象都是建立在云函数上针对特定场景的优化。

  1. clientDB针对的场景是数据库操作,它优化了可以不写或少写服务器代码。
  2. 云对象针对的场景是非数据库操作或不宜前端暴露的数据库操作时,和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不适用的情况:

  1. 请求不操作云数据库,比如向外部web系统发送请求,操作redis、删除云文件等 
  2. 操作的云数据库请求不希望暴露在前端
  3. 数据库表和字段数量多而接口数量少。给每个数据配置权限的工作量超过了控制少数接口权限的工作量
  4. 权限体系较复杂,除了用户和管理员外还有较多其他权限条件或动态权限。此时在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) //导入云对象后就可以直接调用该对象的方法了,注意使用异步await
		console.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') //导入云对象后就可以直接调用该对象的方法了,注意使用异步await
		uni.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官网

 内置特殊方法

所有_开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法

  1. _before  
  2. _after    
  3. _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.startTime
		return result
	}
}

定时运行    _timing

uni-app官网文章来源地址https://www.toymoban.com/news/detail-496296.html

到了这里,关于uniapp - uniCloud 云函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

    kxmalls外卖生鲜多商户,针对中小商户、企业和个人学习者开发。使用Java编码,采用SpringBoot、Mybatis-Plus等易用框架,适合个人学习研究。同时支持单机部署、集群部署,用户与店铺范围动态定位,中小商户企业可根据业务动态扩容。kxmalls使用uniapp前端框架,可同时编译到 微

    2024年01月25日
    浏览(74)
  • UnityMirror学习笔记(3):服务器与客户端间的函数调用,互发控制指令:Command,ClientRpc,TargetRpc

    Mirror是一个简单高效的开源的Unity多人游戏网络框架。 官方文档链接: https://mirror-networking.gitbook.io/docs API Mirror提供了一个特性 Command 来进行从客户端到服务器的远程控制指令, 它的核心逻辑就是,当 客户端 的脚本调用此特性修饰的函数时, 服务端 的 对应的对象 执行此函数

    2024年02月07日
    浏览(41)
  • 7、hive shell客户端与属性配置、内置运算符、函数(内置运算符与自定义UDF运算符)

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(48)
  • uniapp - uniCloud 云函数

    目录 云函数 分类 客户端和云函数的通信  clientDB方式  云对象方式 云对象  云对象的Api  内置特殊方法 预处理   _before  后处理    _after 定时运行    _timing 云函数是运行在云端的javascript代码,是基于Node.js的扩展 在Node API基础上,云函数环境内置了uniCloud对象,这个对象

    2024年02月10日
    浏览(34)
  • 线上 udp 客户端请求服务端客户端句柄泄漏问题

    本题分别从如下三个方面来分享: 问题描述 自定义连接池的编写 common_pool 的使用 线上有一个业务,某个通服务通知 udp 客户端通过向 udp 服务端(某个硬件设备)发送 udp 包来进行用户上线操作 当同时有大量的请求打到 udp 服务端的时候,udp 服务端的回包可能会在网络环境

    2024年02月09日
    浏览(66)
  • es相关的官方客户端与spring客户端对比与介绍

    es提供的 TransportClient 传统的客户端,基于TCP传输协议与Elasticsearch通信。 已经被弃用,不推荐使用。 适用于Elasticsearch 5.x及以前的版本 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。 RestHighLevelClient 是一个高级的REST客户端,主要用于与

    2024年02月02日
    浏览(70)
  • k8s ingress获取客户端客户端真实IP

    在Kubernetes中,获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中,原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点: 安全性:基于客户端IP进行访问控制和认证授权可以提高系统安全性。 日志记录与审计:记

    2024年02月13日
    浏览(61)
  • 云备份客户端——客户端整体设计框架以及实用类工具实现

    客户端要实现的功能和服务端相比相对简单,客户端要实现的功能是 自动对指定文件中的文件进行备份,也就是定时对指定文件进行扫描,根据文件信息判断文件,符合要求(新文件或者被修改过的文件)进行上传 因此我们客户端大概需要实现下面三个模块 数据管理模块:

    2024年02月09日
    浏览(55)
  • PUBG绝地求生怎么下载正式服客户端 游戏客户端在哪下载

    PUBG绝地求生怎么下载正式服客户端 游戏客户端在哪下载 绝地求生是一款大逃杀题材的游戏,受到世界各地小伙伴的喜爱,在游戏中小伙伴们需要通过自身能力寻找地图上的装备充盈自身,利用地形掩护和心理战术击败对手获得最终胜利,不少小伙伴还不清楚如何下载PUBG正式

    2024年04月12日
    浏览(77)
  • java socket Server TCP服务端向指定客户端发送消息;可查看、断开指定连接的客户端;以及设置客户端最大可连接数量。

    首先需要知道java里如何创建一个Socket服务器端。 提示:注意server.accept()方法调用会阻塞,只有新的客户端连接后才返回一个新的socket对象。如果一直未连接那么会一直处于阻塞状态 了解了如何创建一个socket服务器端后。那么如何实现给指定的连接客户端发送消息呢?首先我

    2024年02月11日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包