【愚公系列】《微信小程序与云开发从入门到实践》049-使用云函数
标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
🚀前言
在微信小程序的开发过程中,如何高效地处理业务逻辑和实现复杂功能是每位开发者面临的挑战。云函数作为一种灵活、高效的无服务器计算解决方案,为小程序提供了强大的后台支持,使得开发者能够在云端运行代码,而无需关心服务器的管理与维护。这种架构不仅简化了开发流程,还提升了应用的可扩展性和安全性。
本文将深入探讨在微信小程序中使用云函数的关键概念与应用场景。我们将介绍云函数的基本原理、创建与调用过程,以及如何利用云函数处理数据、实现业务逻辑和与其他云服务的集成。通过实际案例分析,您将了解到云函数在用户身份验证、数据处理和定时任务等方面的具体应用,帮助您更好地理解其在小程序开发中的价值。
🚀一、使用云函数
在小程序开发中,函数的概念随处可见,函数是最基础的功能模块。顾名思义,云函数即是延行在云端的函数,也可以理解为运行在服务器端的函数,也就是我们通常意义上的后端服务。有了云函数功能,开发者无须购买服务器,也无须付出服务器搭建、运维等成本,即可编写函数部署到云端,由小程序端进行调用,同时,云函数之间也可以互相调用。
🔎1.初识云函数
🦋1.1 云函数概述
云函数是一种在 云端 执行的 JavaScript 函数,与本地的 JavaScript 函数相似。它运行在 Node.js 环境中,因此可以执行所有 Node.js 支持的代码。云函数可以访问小程序的云数据库、云存储等功能,通过云函数 SDK 提供的 API,开发者可以更方便地在云端进行数据处理和操作。
🦋1.2 创建云函数
-
指定云开发目录:
在项目的project.config.json
文件中,添加如下配置来指定云开发目录:"cloudfunctionRoot": "cloud/"
这会在项目根目录下自动生成一个名为
cloud
的文件夹。右键点击该文件夹,弹出云开发功能菜单,可以进行环境设置、本地调试、同步云函数等操作。
-
新建云函数:
在cloud
目录下创建一个新的云函数,命名为cloudLog
。创建后,cloudLog
会被包装成一个文件夹,其中包含以下文件:cloudfunction.config.json
:云函数的配置文件。index.js
:云函数的执行入口文件。package.json
:定义云函数的依赖包。
-
编写云函数代码:
在index.js
文件中编写云函数的具体逻辑。下面是一个简单的例子,它获取小程序的基本信息并返回给客户端:// 云函数入口文件 const cloud = require('wx-server-sdk') // 初始化云环境 cloud.init() // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() let str = `openid:${wxContext.OPENID}\nappid:${wxContext.APPID}\nunionid:${wxContext.UNIONID}` return { data: str } }
这个云函数将返回当前小程序的
OPENID
、APPID
和UNIONID
。 -
上传并部署云函数:
在cloudLog
文件夹上右键点击,选择 上传并部署,将此云函数发布到云端。
🦋1.3 在小程序中调用云函数
-
初始化云环境:
在小程序的cloudFunc
页面中,首先初始化云环境:wx.cloud.init({ env: 'cloud1-4ghg65i9b5531b77' // 填写您的云环境ID })
-
调用云函数:
使用wx.cloud.callFunction
调用云函数,并处理返回的结果:wx.cloud.callFunction({ name: 'cloudLog', // 云函数名 success: res => { // 调用成功的回调 console.log(res.result.data); // 打印返回的字符串数据 }, fail: err => { // 调用失败的回调 console.error(err); } })
通过上述代码,小程序客户端可以成功调用云函数并获取返回的结果。返回的数据是云函数中返回的
data
字符串。
🦋1.4 修改云函数以实现加法计算
为了使云函数具备更复杂的功能,我们可以修改云函数 cloudLog
,让它接受两个数字并返回它们的和。
-
修改
cloudLog
云函数:
在cloudLog
的index.js
中,添加对传入参数a
和b
的加法计算:exports.main = async (event, context) => { const wxContext = cloud.getWXContext() let str = `openid:${wxContext.OPENID}\nappid:${wxContext.APPID}\nunionid:${wxContext.UNIONID}` return { data: str, sum: event.a + event.b // 返回a和b的和 } }
-
调用云函数时传递参数:
在小程序中调用云函数时,传入a
和b
的值:wx.cloud.callFunction({ name: 'cloudLog', // 云函数名 data: { a: 3, b: 4 }, // 传递的参数 success: res => { console.log(res.result.data); // 打印返回的字符串数据 console.log(res.result.sum); // 打印计算结果:a + b = 7 }, fail: err => { console.error(err); } })
这段代码会调用云函数
cloudLog
,并将a
和b
传递给它,云函数计算并返回结果。
🦋1.5 本地调试与上传
在开发过程中,建议先进行 本地调试,确保云函数的逻辑无误,然后再上传到云端部署。
-
本地调试:
- 在
cloud
目录中右键点击,选择 本地调试。 - 打开本地调试面板,勾选需要调试的云函数。
- 在小程序中调用该云函数,进行调试。
- 在
-
上传部署:
调试完成后,可以通过右键点击云函数目录进行上传,将调试过的云函数部署到云端,供正式使用。
🦋1.6 总结
- 云函数的编写:云函数与本地 JavaScript 函数相似,运行在 Node.js 环境中,可以利用 Node.js 的标准库和云开发 SDK 访问云数据库、云存储等服务。
- 创建和部署云函数:通过指定云开发目录、编写云函数代码、上传并部署到云端,完成云函数的创建和发布。
- 调用云函数:使用
wx.cloud.callFunction
在小程序中调用云函数,并处理异步返回的结果。 - 本地调试与上传:在本地调试云函数,确认无误后再上传到云端进行部署。
通过云函数,开发者可以将一些逻辑处理和计算任务移到云端执行,减轻小程序的负担,提高应用的性能与扩展性。
🔎2.在云函数中使用云数据库
🦋2.1 云函数中的安全性与权限
云函数运行在服务端,相较于客户端,它的安全性更强。云函数的代码不受数据库读写权限和文件读写权限的限制,可以直接与云数据库和云存储进行交互。这意味着,开发者可以在云函数中进行更加灵活和安全的数据操作,将一些敏感操作或复杂逻辑封装到云函数中,从而避免在客户端暴露数据库操作。
🦋2.2 创建云函数与操作云数据库
创建 cloudDB
云函数
可以在云开发工作目录的 cloud
目录下创建一个新的云函数,命名为 cloudDB
,并在其 index.js
文件中编写如下代码:
// 云函数入口文件
const cloud = require('wx-server-sdk')
// 初始化云开发环境
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV // 使用当前环境
})
// 获取云数据库实例
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
return db.collection('books').get() // 查询 'books' 集合中的所有数据
}
cloud.init()
:用于初始化云开发环境。如果使用cloud.DYNAMIC_CURRENT_ENV
,表示使用当前云函数执行的环境。cloud.database()
:获取云数据库实例。db.collection('books').get()
:查询books
集合中的所有数据,返回一个 Promise 对象。
🦋2.3 客户端调用云函数
在小程序中,可以使用 wx.cloud.callFunction()
来调用云函数 cloudDB
并处理返回的结果:
wx.cloud.callFunction({
name: "cloudDB", // 云函数名
success: res => {
console.log(res.result) // 输出返回的结果
},
fail: err => {
console.error(err) // 调用失败的回调
}
})
通过此方法,小程序客户端能够调用云函数并获取返回的数据。
🦋2.4 云数据库常用方法
云函数可以通过 云数据库实例 进行数据操作,常用的方法包括 collection
、createCollection
、serverDate
和 runTransaction
。下面是对常用方法的详细介绍:
云数据库实例方法
方法名 | 参数 | 描述 |
---|---|---|
collection |
name: String |
获取指定集合的实例 |
createCollection |
name: String |
创建一个新的集合,如果集合已存在,则创建失败 |
serverDate |
无 | 获取服务端时间,常用于设置查询条件或更新记录的时间戳 |
runTransaction |
callback: Function |
发起数据库事务,进行复杂的多步操作 |
🦋2.5 集合实例常用方法
集合实例用于对数据库中的具体集合进行操作。常见的方法如下表所示:
方法名 | 参数 | 描述 |
---|---|---|
add |
data: Object |
新增一条记录,返回新建记录的主键值 |
aggregate |
无 | 发起数据库聚合操作,返回 Aggregate 对象 |
get |
无 | 查询集合中的所有记录 |
limit |
value: Number |
设置查询结果的数量上限 |
skip |
value: Number |
设置查询结果跳过多少条记录 |
update |
data: Object |
更新集合中的记录 |
watch |
onChange: Function, onError: Function |
监听集合数据的变化 |
🦋2.6 操作文档的方法
使用集合实例的 doc
方法可以获取指定记录(文档),并对该记录进行操作。常用的文档操作方法如下:
方法名 | 参数 | 描述 |
---|---|---|
get |
无 | 获取文档的所有数据 |
set |
data: Object |
替换文档的内容 |
update |
data: Object |
更新文档内容 |
remove |
无 | 删除文档 |
🦋2.7 使用 Command 对象进行复杂操作
在进行数据查询或更新时,可以使用 Command
对象来进行更加复杂的操作,例如增加、减少字段值、数组操作等。这些操作通常在更新或查询条件中使用,但在这篇总结中不做过多介绍。
🦋2.8 示例:更复杂的数据库操作
假设我们希望在云函数中进行一个更复杂的操作,比如更新一个 books
集合中的某个记录:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
exports.main = async (event, context) => {
try {
// 更新指定记录
const result = await db.collection('books').doc(event.id).update({
data: {
title: event.title, // 更新书籍标题
author: event.author // 更新作者
}
})
return { success: true, result }
} catch (error) {
return { success: false, error }
}
}
在此代码中,event.id
是传入的文档 ID,通过 doc(id)
方法指定文档,然后使用 update
方法更新其中的字段。
🦋2.9 总结
- 云函数与云数据库结合:云函数提供了强大的服务端功能,可以通过它来访问和操作云数据库中的数据。由于云函数运行在服务端,它拥有更强的安全性,可以避免数据库操作暴露给客户端。
- 常用数据库操作:在云函数中操作云数据库时,常使用
collection
、get
、add
、update
等方法进行增删改查。此外,可以使用Command
对象执行更复杂的数据库操作。 - 云函数的优势:将敏感的数据处理、权限管理等业务逻辑移到云函数中,可以提高安全性、简化客户端代码,并且灵活处理数据库事务和复杂查询。
通过这些方法,开发者可以高效地在小程序中实现与云数据库的交互,支持更复杂的业务需求。
🔎3.在云函数中使用云存储
🦋3.1 云存储概述
云存储的逻辑较为简单,主要功能就是进行 文件上传 和 文件下载。通常情况下,文件上传和下载的操作会直接在 小程序端 进行,而不需要在云函数中调用云存储功能接口。然而,在某些情况下,你可能会需要在云函数中处理文件操作,这时可以使用云存储接口。
🦋3.2 创建 cloudStorage
云函数
你可以在 云开发文件夹(cloud
)中新建一个名为 cloudStorage
的云函数,并在其 index.js
文件中编写如下代码。
云函数上传文件
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
return cloud.uploadFile({
cloudPath: 'demo.txt', // 云端文件存储路径
fileContent: 'xxxxxx' // 文件内容
})
}
cloud.uploadFile()
:此方法用于上传文件到云存储。你需要提供两个参数:cloudPath
:指定文件在云存储中的路径。fileContent
:文件的内容,可以是Buffer
或String
。
调用此云函数后,文件将被上传到云存储,cloudPath
就是云端存储路径,上传的文件内容是 fileContent
。
客户端调用上传云函数
在小程序端,你可以通过以下方式调用上传文件的云函数:
wx.cloud.callFunction({
name: "cloudStorage", // 云函数名
success: res => {
console.log(res) // 输出返回结果
},
fail: err => {
console.error(err) // 调用失败的回调
}
})
🦋3.3 云函数下载文件
除了上传文件,云函数也可以用于 下载文件。以下是云函数下载文件的示例代码:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const fileID = "xxxx" // 文件 ID,用于下载文件
// 调用 cloud.downloadFile 方法下载文件
const res = await cloud.downloadFile({
fileID: fileID // 传入需要下载的文件ID
})
const buffer = res.fileContent // 获取文件内容(Buffer)
return buffer.toString('utf8') // 转换成字符串并返回
}
cloud.downloadFile()
:用于下载云存储中的文件。你需要提供一个fileID
,这个fileID
可以在上传文件时返回,也可以通过其他方式获取。res.fileContent
:下载的文件内容是一个Buffer
,你可以将其转换为string
,例如使用.toString('utf8')
转换为 UTF-8 编码的字符串。
客户端调用下载云函数
小程序端可以通过以下代码调用云函数来下载文件:
wx.cloud.callFunction({
name: "cloudStorage", // 云函数名
success: res => {
console.log(res.result) // 输出下载的文件内容
},
fail: err => {
console.error(err) // 调用失败的回调
}
})
🦋3.4 总结
- 云存储上传:使用
cloud.uploadFile()
方法将文件上传到云存储。文件内容和路径由开发者指定。 - 云存储下载:使用
cloud.downloadFile()
方法下载云存储中的文件。通过fileID
来指定下载的文件,返回的文件内容为Buffer
,可以转换为字符串。 - 云函数的作用:虽然通常在客户端处理文件上传和下载,云函数在处理文件时也能提供额外的安全性和灵活性,尤其是在涉及到一些复杂业务逻辑时。
通过这些操作,开发者可以将文件管理的复杂操作封装在云函数中,简化客户端代码,同时提高系统的安全性和可靠性。
🔎4.在云开发控制台管理云函数
云开发控制台提供了云函数管理模块,其中可以直接进行云函数的创建和删除,版本设置等,如图所示。
其中,版本管理功能非常有用,在实际产品开发迭代中,经常会对已有的云函数进行升级,升级有时是有一定的风险的,这时可以通过版本管理中的灰度功能来分流量地发布升级后的云函数,使风险更加可控,版本与配置页面如图所示。
当一个云函数被发布时,默认会发布到SLATEST版本,表示最新版本,因此在发布云函数前,可以将当前所使用的云函数发布一个自定义的版本,云函数更新后可以通过流量分配的方式来对线上用户进行灰度验证,如果没有意外问题,可以逐步提高SLATEST版本的流量比例,如果发现了重大问题,也可以将SLATEST版本的流量设置为零,这样理论上线上用户所使用的云函数在控制台中也可以看到所有云函数的调用情况,日志分为简单日志和高级日志,简单日志会版本将回滚到最近的稳定版本。将所有的调用记录进行展示,支持按照状态和时间进行筛选,如图所示。高级日志则支持对日志的内容进行筛选,并支持简单的“与”“或”逻辑。
🔎5.云函数的定时触发器
🦋5.1 定时触发器简介
定时触发器使得云函数能够按照设定的时间周期自动触发和执行。这对于需要周期性任务(例如:电商小程序中的商家收入结算)非常有用。你可以通过配置定时触发器,自动触发云函数,而无需手动调用。
🦋5.2 创建 cloudTimer
云函数
在云开发项目的 cloud
文件夹下,可以创建一个名为 cloudTimer
的云函数,并在 index.js
中编写测试代码。下面是云函数的简单示例:
index.js
文件
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
console.log("定时器触发了");
console.log(Date()); // 打印当前时间
}
此时,cloudTimer
云函数和普通云函数没有任何区别,仍然可以通过小程序端进行调用。但要让其自动周期性触发,还需要配置定时触发器。
🦋5.3 配置定时触发器
在 cloudTimer
云函数文件夹下,需要创建 config.json
文件,用来配置定时触发器的相关信息。定时任务配置格式如下:
config.json
文件
{
"triggers": [
{
"name": "trigger",
"type": "timer",
"config": "*/10 * * * * * *"
}
]
}
字段说明:
name
:设置定时触发器的名称。type
:设置触发器的类型,这里为timer
,表示定时器类型。config
:配置定时任务的具体时间规则,使用类似 Cron 表达式 的格式。
🦋5.4 Cron 表达式格式
定时触发器的 config
字段是一个字符串,通过空格分隔成 7 个部分,分别代表:
- 秒(0-59)
- 分钟(0-59)
- 小时(0-23)
- 日(1-31)
- 月(1-12)
- 星期(0-6,0代表星期天)
- 年(1970-2099)
示例:
"*/10 * * * * * *"
代表每 10秒 触发一次。
🦋5.5 常用的 Cron 表达式通配符
以下是一些常见的通配符,用来灵活配置定时触发器:
通配符 | 说明 |
---|---|
* |
表示所有值,类似于 “每”。例如 * 表示每秒、每分钟等。 |
, |
逗号分隔,表示取并集。例如 10,20 表示在第10秒和第20秒触发。 |
- |
连接表示范围。例如 10-20 表示从第10秒到第20秒的每一秒触发。 |
/ |
步长。例如 1/10 表示从第1分钟开始,每隔10分钟触发一次。 |
示例:
"*/10 * * * * *"
:每10秒触发一次。"0 0 12 * * *"
:每天中午12点触发。
🦋5.6 上传和激活定时触发器
完成配置后,需要上传触发器使其生效。操作步骤如下:
- 上传触发器:右键点击
cloudTimer
云函数文件夹,选择 “上传触发器”,将配置的触发器上传至云平台。 - 触发器生效:上传后,定时触发器就会生效,云函数将根据配置的时间周期自动触发执行。
🦋5.7 查看日志与调试
上传并激活触发器后,你可以在 控制台的日志模块 中查看云函数的执行情况。例如,查看定时器是否按预期时间触发、是否出现错误等。
🦋5.8 删除定时触发器
如果你不再需要某个定时任务,可以在云函数管理界面删除对应的触发器,停止定时任务的自动执行。
🦋5.9 总结
- 定时触发器:允许云函数按指定时间间隔自动执行,非常适合周期性任务(如每月结算、定时清理数据等)。
- 配置 Cron 表达式:通过
config.json
配置定时触发器的时间规则,可以灵活设置任务触发的频率。 - 上传触发器:配置完成后需要上传触发器文件,以让定时任务生效。
- 监控与调试:定时任务执行过程中,可以查看日志以确保触发器按预期触发并执行。
通过这些功能,开发者可以轻松实现定时任务的自动化,减少人工操作,提高系统效率和可靠性。
- 点赞
- 收藏
- 关注作者
评论(0)