云函数的独特优势在于与微信登录鉴权的无缝整合
发表时间:2023-10-14 13:37:48
文章来源:炫佑科技
浏览次数:181
菏泽炫佑科技 菏泽炫佑小程序开发 菏泽炫佑app制作 炫佑科技
云函数的独特优势在于与微信登录鉴权的无缝整合
云函数的编写方式就像本地定义的方法一样,代码在云端的 Node.js 中运行。 当小程序调用云函数时,定义的代码将在 Node.js 运行环境中执行。 我们可以像在Node.js环境中一样在云函数中进行网络请求等操作,也可以通过云函数后端SDK使用各种服务,比如使用云函数SDK中提供的数据库和存储API 。 数据库和存储操作请参考数据库和存储后端API文档。
开发云功能的独特优势在于与微信登录认证的无缝集成。 当小程序调用云函数时,云函数传入的参数会被注入到小程序用户的参数中。 开发不需要验证正确性,因为微信已经完成了这部分的认证,开发可以直接使用。
接下来我们将逐步学习以下内容:
我的**个云函数
作为云函数的**个示例,我们将定义一个将两个数字相加的函数。
找到项目根目录下的..json文件,添加新字段,并指定本地已有目录作为云函数的本地根目录。
例子:
{
"cloudfunctionRoot": "./functions/"
}
..json的其他配置请参见项目配置文件。
指定完成后,云功能根目录的图标将变为“云目录图标”。 云函数根目录下的一级目录(云函数目录)与云函数同名。 如果对应的在线环境存在则该云功能会标有特殊的“云图标”
接下来,我们右键单击云函数根目录。 在右键菜单中,我们可以选择创建新的Node.js云函数。 我们将云函数命名为add。 开发工具在本地创建云函数目录和入口index.js文件,在线环境中也创建对应的云函数。 创建成功后,工具会提示是否立即在本地安装依赖项。 确认后,工具会自动安装wx--sdk。 我们可以看到类似如下的云函数模板:
const cloud = require('wx-server-sdk')
// 云函数入口函数
exports.main = async (event, context) => {
}
云函数的传入参数有两个,一个是事件对象,一个是对象。 事件是指触发云功能的事件。 小程序调用云函数时,事件就是小程序调用云函数时传入的参数,加上后端自动注入的小程序用户和小程序的appid。 该对象这里包含了调用的调用信息和运行状态,可以用来了解服务的运行状态。 模板也默认了wx--sdk,这是微信提供的一个库,帮助我们在云函数中操作数据库、存储和调用其他云函数。 我们会在另外的章节讲wx--sdk的使用。
我们来填写模板:
exports.main = async (event, context) => {
return {
sum: event.a + event.b
}
}
这段代码的意思就是将传入的a和b相加,作为sum字段返回给调用端。
在小程序中调用这个云函数之前,我们需要先将云函数部署到云端。 右键点击云函数目录,在右键菜单中,我们可以将整个云函数打包上传并部署到线上环境。
部署完成后,我们就可以在小程序中调用云函数了:
wx.cloud.callFunction({
// 云函数名称
name: 'add',
// 传给云函数的参数
data: {
a: 1,
b: 2,
},
success: function(res) {
console.log(res.result) // 3
},
fail: console.error
})
当然,也支持样式调用:
wx.cloud.callFunction({
// 云函数名称
name: 'add',
// 传给云函数的参数
data: {
a: 1,
b: 2,
},
})
.then(res => {
console.log(res.result) // 3
})
.catch(console.error)
这样到这里我们就成功创建了我们的**个云函数,并在小程序中成功调用了它!
接下来介绍如何将云功能与小程序登录状态无缝结合,以及如何在云功能侧获取小程序用户信息(以及appid)。
获取小程序用户信息
开发云功能的独特优势在于与微信登录认证的无缝集成。 当小程序调用云函数时,云函数传入的参数会被注入到小程序用户的参数中。 开发不需要验证正确性,因为微信已经完成了这部分的认证,开发可以直接使用。 同样注入云功能的还有小程序的appid。
小程序调用云函数时,开发可以通过云函数中wx--sdk提供的方法获取每次调用的上下文(appid等)。 无需维护复杂的身份验证机制即可获取自然可识别的信息。 可信用户登录状态()。 可以写一个这样的云函数来测试:
// index.js
const cloud = require('wx-server-sdk')
exports.main = (event, context) => {
// 这里获取到的 openId、 appId 和 unionId 是可信的,注意 unionId 仅在满足 unionId 获取条件时返回
let { OPENID, APPID, UNIONID } = cloud.getWXContext()
return {
OPENID,
APPID,
UNIONID,
}
}
假设云函数名为test。 云函数上传部署后,可以在小程序中测试调用:
wx.cloud.callFunction({
name: 'test',
complete: res => {
console.log('callFunction test result: ', res)
}
})
您将在调试器中看到输出 res 是一个具有以下结构的对象:
{
"APPID": "xxx",
"OPENID": "yyy",
"UNIONID": "zzz", // 仅在满足 unionId 获取条件时返回
}
接下来我们看看如果需要在云函数中执行异步操作然后返回该怎么办。
异步返回结果
很多时候,我们需要在云函数中处理一些异步操作,然后在异步操作完成后将结果返回给调用者。 此时我们可以通过返回云函数中的一个方法来完成。
一个*简单的例子:
// index.js
exports.main = async (event, context) => {
return new Promise((resolve, reject) => {
// 在 3 秒后返回结果给调用方(小程序 / 其他云函数)
setTimeout(() => {
resolve(event.a + event.b)
}, 3000)
})
}
假设云函数名称为test。 云函数上传部署完毕后,我们就可以测试小程序调用了:
// 在小程序代码中:
wx.cloud.callFunction({
name: 'test',
data: {
a: 1,
b: 2,
},
complete: res => {
console.log('callFunction test result: ', res)
},
})
此时您应该看到调试器输出:
callFunction test result: 3
使用 npm
在云函数中云函数的独特优势在于与微信登录鉴权的无缝整合,我们可以引入第三方依赖来帮助我们更快地开发。 云函数的运行环境是Node.js,所以我们可以使用npm来安装第三方依赖。 例如微信小程序开发组件库,在云函数中除了使用Node.js提供的原生http接口发起网络请求外,我们还可以使用流行的Node.js网络请求库来更方便地发起网络请求。
请注意,上传云函数时,依赖项不会自动安装到云端。 开发需要在本地安装依赖,然后一起打包上传。
接下来我们看一下官方提供的云函数SDK:wx--sdk。
云函数中使用wx--sdk
云函数属于管理端,云函数中运行的代码拥有无限的数据库读写权限和云文件读写权限。 需要注意的是,云函数运行环境是管理端,与传入云函数对应的微信用户是否是小程序的管理员/开发无关。
在云函数中使用wx--sdk,需要在对应的云函数目录下安装wx--sdk依赖。 创建云函数时,会在云函数目录下默认创建一个.json文件,并提示用户是否立即在本地安装依赖。 请注意,云函数的运行环境是Node.js,所以在本地安装依赖时,一定要安装Node.js,并且node和npm都在环境变量中。 如果不想在本地安装依赖,可以使用命令行在该目录下运行:
npm install --save wx-server-sdk@latest
在调用云函数中的其他API之前,和小程序一样,也需要执行一个初始化方法:
const cloud = require('wx-server-sdk')
// 默认配置
cloud.init()
// 或者传入自定义配置
cloud.init({
env: 'some-env-id'
})
wx--sdk提供与小程序上云API风格相同的数据库、存储和云函数API。 下面举几个操作数据库、存储、云功能的简单例子:
云函数中调用数据库
假设数据库中已经有一个todos集合,我们可以通过以下方式获取todos集合的数据:
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
exports.main = async (event, context) => {
// collection 上的 get 方法会返回一个 Promise,因此云函数会在数据库异步取完数据后返回结果
return db.collection('todos').get()
}
调用云函数中的存储
假设我们要上传云函数目录下包含的图片文件(demo.jpg):
const cloud = require('wx-server-sdk')
const fs = require('fs')
const path = require('path')
exports.main = async (event, context) => {
const fileStream = fs.createReadStream(path.join(__dirname, 'demo.jpg'))
return await cloud.uploadFile({
cloudPath: 'demo.jpg',
fileContent: fileStream,
})
}
云函数中, 的值为云函数代码所在目录。 云函数调用其他云函数。
假设我们要在云函数中调用另一个云函数sum,并返回sum返回的结果:
const cloud = require('wx-server-sdk')
exports.main = async (event, context) => {
return await cloud.callFunction({
name: 'sum',
data: {
x: 1,
y: 2,
}
})
}
更详细的wx--sdk文档请参见服务器端API文档。
接下来我们来了解一下云函数的运行机制。
运行机制 运行环境
云函数运行在云端Linux环境 1. 一个云函数在处理并发请求时会创建多个云函数实例。 每个云函数实例相互隔离,没有公共内存或硬盘空间。 云函数实例的创建、管理和销毁均由平台自动完成。 每个云函数实例在/tmp目录下提供512MB临时磁盘空间,用于处理单次云函数执行过程中的临时文件读写需求。 需要注意的是,这个临时磁盘空间是在函数执行期间使用的。 完成后可能会被破坏,不应该依赖和假设存储在磁盘空间中的临时文件将永远存在。 如果您需要持久存储,请使用云存储功能。
无状态函数
云函数应该是无状态且幂等的,即一个云函数的执行不依赖于前一个云函数执行过程中残留在运行环境中的信息。
为了保证负载均衡,云函数平台会根据当前的负载情况控制云函数实例的数量,并在某些情况下复用云函数实例。 这使得两个连续的云函数调用由同一个云函数实例运行。 两者会共享同一个临时磁盘空间,但是由于云函数实例随时可能被销毁,并且连续的请求不一定会落在同一个实例上,所以云函数不应该依赖于之前留下的临时磁盘空间云函数调用。 数据。 总的原则是云函数代码应该是无状态的。
事件模型
云函数的调用采用事件触发的模型。 每次调用小程序都会触发云函数调用事件。 云函数平台将创建或重用现有的云函数实例来处理调用。 同样,由于云函数之间也可以互相调用,云函数之间互相调用也会触发调用事件。
自动伸缩
开发无需担心云功能的扩缩容。 平台会根据负载自动伸缩。
目前的运行环境是7.2。 请特别注意编写不应依赖于特定操作系统或特定操作系统版本号的代码。 运行环境可能会发生变化,代码应尽可能与平台无关。 注意事项和常见问题解答
临时存储空间
云函数的运行环境在/tmp目录下提供了512MB的临时磁盘空间,用于处理单次云函数执行过程中的临时文件读写需求。 需要注意的是,这个临时磁盘空间在函数执行后可能会被破坏,不应该依赖或假设存储在磁盘空间中的临时文件将永远存在。 如果您需要持久存储,请使用云存储功能。
用户代码目录:
云函数执行过程中,您可以获取当前云函数的根目录。 如果有云功能打包上传的资源文件,可以通过添加相对路径引用来获取。
Node.js 依赖项
如果使用了平台相关的依赖,即依赖需要在对应平台下编译(/macOS/Linux...),上传前一定要在Linux平台下编译(7*好),否则环境差可能会出现兼容性问题。
在开发工具中管理云函数并配置云函数本地目录
您可以使用项目根目录下的..json文件,定义其中的字段,并指定本地现有目录作为云函数的本地根目录。
云功能操作
在云函数根目录或者云函数目录下,通过单击鼠标右键,我们可以调出右键菜单,完成以下操作
查看当前环境。 切换环境。 创建一个新的 Node.js 云函数。 下载线上环境的云功能列表。 下载线上环境的云函数代码并覆盖到本地。 对比本地代码和线上环境的代码。 将云功能上传并部署到线上环境。 查看和切换环境
右键单击云函数根目录。 右键菜单中可以查看当前对应的环境以及切换环境。 后续所有右键菜单都将在该环境下操作。
创建新的 Node.js 云函数
右键单击云函数根目录,在右键菜单中可以选择新建Node.js云函数。 开发工具在本地创建以下目录和文件,在线环境中创建对应的云函数:
创建成功后,工具会提示是否立即安装云功能的本地依赖,即wx--sdk。 如果是这样,该工具将打开终端来执行 npm。
下载云功能列表
右键单击云函数根目录。 在右键菜单中,我们可以将在线环境中的云功能列表同步到本地。 开发工具会根据云函数的名称在本地创建对应的云函数目录。
下载云函数
右键单击云函数目录,然后从菜单中选择下载云函数。 云函数代码将会下载到指定目录。
上传并部署
右键单击云函数目录,在右键菜单中,我们可以将云函数整体打包上传并部署到线上环境。