开发者学堂课程【玩转EMAS Serverless精品课-疫苗预约小程序:实战:Serverless SDK 集成】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/926/detail/14576
实战:Serverless SDK 集成
内容介绍:
一、EMAS Serverless 开发准备
二、 Serverless SDK 介绍
三、实战: Serverless SDK 集成
四、实战:云资源调用
五、课程总结
本节内容:
本节主要分为两个部分,第一部分是偏理论的讲解,第二部分是实战内容。首先要学习作为一个支付宝小程序开发者在支付宝小程序中接入 EMAS Serverless 的开发前的准备,然后再介绍 Serverless SDK 是什么,有什么功能,能做什么。在实战环节会用一个 demo 来串讲 Serverless SDK 的功能,演示其返回值和结构等等,以及会演示上节讲过的云资源的调用和使用。
一、EMAS Serverless 开发准备
1.开通支付宝小程序的账号
(1)访问支付宝开发平台:
https://open.alipay.com/platform/home.htm
(2)支付宝扫码登陆
(3)在控制台中创建小程序(点击创建应用)
输入一个符合运营规则的小程序名称,点击创建
创建完成(此时可以点击复制获得 APPID)
(有了小程序 id 后,需要在小程序开发时把小程序 id 与支付宝的开发工具关联)
(4)打开小程序开发工具 IDE 创建空白小程序模板
(提前下载好小程序开发工具 IDE )
一个支付宝 id 页面打开图式:
(5)选择刚刚开通的小程序
可以在左上角选择相应的小程序:
如果是第一次则需先进行扫码登陆,登录后就可以进行选择小程序
选择完小程序后,完成了小程序 id 与支付宝账号的绑定。
以上是支付宝小程序开发的必经操作
(6)EMAS Serverless开发者接入
有了 IDE 和支付宝小程序账号后,可以随意的使用 Serverless SDK 去访问 EMAS Serverless 的一些云资源吗?
答案是否定的,出于安全考虑,EMAS Serverless 是有一定的鉴权机制,为了包含一些云函数,云数据库,元存储的资源不被恶意的使用和访问。这个鉴权机制是一个与密钥相关的机制,需要开发者将自身需要的小程序信息以及相关的密钥信息在 EMAS Serverless 的控制台上进行设置。有了该设置后,如果小程序未经授权访问了其服务空间,其 spaceID 下的云资源,该访问会被拒绝,无法通行。
正常的访问是支付宝小程序携带一些鉴权相关的信息,利用 SDK 进行鉴权,鉴权成功后,可以访问名下的云资源
因此,下面介绍如何填写密钥信息
2.支付宝小程序密钥配置
(1)登录 EMAS Serverless 控制台:
https://mp.console.aliyun.com/cloudDev/setting
第一次登录需要扫码或输入账号密码
(2)在设置分栏中配置密钥信息
先在支付宝底下选择添加密钥
AppID 在第一步可以知道如何获取
加签模式一般选择公钥
应用私钥和支付宝公钥的获取在后续讲解
3.应用私钥获取
(1)下载支付宝开放平台开发助手:
(2)生成应用密钥
点击生成即可
(3)复制私钥填入EMAS Serverless 控制台
(4)记录应用公钥,后续换取支付宝公钥
4.支付宝公钥获取
(1)进入小程序后台
(2)进入开发设置
有一个接口加签的方式,点击设置(第一次需要发送手机短信获取验证码打开该面板)
(3)填入应用公钥
(4)保存并换取支付宝公钥
二、 Serverless SDK 介绍
1.Serverless SDK 的好处
简单来说,Serverless SDK 是一个包
可以在小程序中通过依赖管理的方式集成这个包去访问云资源,使用 SDK 的好处有:
首先,SDK 会集成一个鉴权的方式,鉴权是一个比较复杂的步骤,SDK 可以简单得完成该步骤,用户只需调用一个接口即可。并且这是一个静默授权的方式,比如作为开发者,不会因为授权影响客户,例如一些弹窗。
另外,SDK 可以自动保护。例如,授权信息在一段时间内生效,但是又去访问了原函数的接口,这时 SDK 会续存 token 的活性
第三是 SDK 提供了一套友好的接口规范,开发者可以根据该规范很好的设计代码,包括返回值是规范起来的 promise 的一个对象。
总的来说,借助 SDK 小程序,开发者可以高效安全的使用 EMAS Serverless 的云资源。
2. Serverless SDK 的功能
(1)云函数的服务
函数签名:
mpserverless.function.invoke(functionName: string.functonArgs?: object ): Promise<Result>
说明:
mpserverless 是 SDK 的实例对象,一级访问接口是 function或者是 db ,原函数接口只有一个 invoke (调用原函数),接口入参是 functionName 和一个非必要得参数。
人口参数:
字段名 |
类型 |
必填 |
说明 |
字段名 |
functionName |
string |
是 |
所调用的云函数名 |
functionName |
functionArgs |
object |
否 |
传入目标云函数的参数 |
functionArgs |
返回参数:
字段名 |
类型 |
说明 |
success |
Boolean |
执行状态 |
requestld |
string |
请求ID |
SDK 会在后续更加详细的介绍其使用
(2)云数据库服务
云数据库 SDK 接口清单:
可以通过 SDK 实现
接口名 |
说明 |
aggregate |
对数据库执行聚合查询 |
count |
获取集合中符合条件的记录数量 |
deleteOne |
删除集合中的一条记录 |
deleteMany |
删除集合中的一批记录 |
distinct |
获取某个属性去重后的所有记录 |
find |
查询集合中的记录 |
findOne |
查询集合中的单条记录 |
findOneAndDelete |
查询并删除一条记录,并将这条数据返回 |
findOneAndReplace |
查询并替换一条记录 |
findOneAndUpdate |
查询并更新一条记录 |
replaceOne |
查询并整体替换这条记录 |
insertMany |
插入一批记录到集合中 |
insert0ne |
插入一条记录到集合中 |
updateMany |
更新集合中的一批记录 |
updateOne |
更新集合中的一条记录 |
以 find 为例:
接口实例:
mpserverless.db.collestion(collection:string).find(query?:object,options?:object):Promise <MongoResult>
说明:
数据库的接口群与 Mongo比较像,指定 collection 就是指定数据库中的数据表对其操作。
入口参数:
字段名 |
类型 |
必填 |
说明 |
query |
object |
否 |
数据库操作时的查询条件 |
options |
object |
否 |
控制项 |
options.limit |
Number |
否 |
查询的文档数量限制 |
options.skip |
Number |
否 |
跳过的文档数量 |
options.sort |
object |
否 |
指定排序的字段,并使用1和-1来指定排序的方式。其中:1表示升序排列、-1表示降序排列 |
options.projection |
object |
否 |
使用投影操作符指定返回的键,值设置为1的字段返 |
返回参数
字段名 |
类型 |
说明 |
success |
Boolean |
操作是否成功 |
result |
Any |
返回结果 |
affectedDocs |
Number |
操作记录的数量 |
(3)云存储服务
云存储SDK接口清单
接口名 |
说明 |
uploadFile |
上传文件到云存储 |
deleteFile |
从云存储删除文件 |
接口示例:
mpserverless.file.uploadFile(options: object): Promise<Result>
入口参数:
字段名 |
类型 |
必填 |
说明 |
options |
object |
是 |
本地上传文件信息 |
返回参数
字段名 |
类型 |
说明 |
filePath |
string |
本地文件路径 |
fileUrl |
string |
云存储文件地址链接 |
关于云存储会在第五节课介绍其详细的用法,包括和支付宝原生的图片的一个结合。
(4)用户信息服务
在支付宝小程序不是很好拿到支付宝的一个 id ,但是可以通过 Serverless 的一个方式支付宝的 id
接口示例:
mpserverless.user.getInfo(options: object ): Promise<Result>
说明:
以 user 为第一个接口的命名,只提供一个接口 getInfo
入口参数
字段名 |
类型 |
必填 |
说明 |
options |
Object |
否 |
options.authProvider alipay_openapi :支付宝〔默认值) wechat_openapi :微信 dingtalk_openapi :钉钉 |
返回参数:
字段名 |
类型 |
说明 |
success |
Boolean |
操作是否成功 |
result |
object |
用户信息: spaceld{String} :服务空间ID userld{string} :用户ID oAuthUserld{String} :三方授权用户标识 |
三、实战: Serverless SDK 集成
1.注意:小程序如何去集成一个 npm 包?
此处有一依赖管理的页面,将需要的包名输入后点击回车,支付宝小程序 IDE 会将依赖下载
可能 IDE 会报错
选择支付宝页面的详情,然后进入项目详情,选中项目配置中的编译 node_modules 模块可以解决该错误:
编译正常:
2.如何集成 Serverless SDK ?
(1)实例化 mpserverless 的对象
首先可以在支付宝小程序中引入 mpserverless-sdk(注意:SDK 导出是 default 形式,所以不用以大括号的形式引入 mpserverless),然后进入 serverless 的实例化(因为导出的是 SDK 的一个实例对,所以将其实例化)
实例化接口:
该类接收为两部分,第一部分小程序所在的程序对象(比如现在是支付宝小程序,所以是 my,如果是微信小程序,则是 wx,钉钉小程序则是 dd),该部分为必填项。第二部分是鉴权信息,包括小程序 id,所使用的 spaceId(使用的服务空间 id),客户端密钥,endpoint(SDK 访问服务接口的域名).
实例化 mpserverless 的对象完成,为了方便使用,可以将该对象挂载在小程序的全局变量上,例如这里是挂载在 my. serverless 上的。以上只是初始化阶段,并没有完成鉴权。
补充:
小程序 id 的另一种获取方式,在完成小程序关联后也可以获取
spaceId 的获取,一定要是当前使用的服务空间,点击详情,获取到 spaceId
客户端密钥的获取:
可以在 spaceId 获取,Secret 下面就是客户端密钥
endpoint 的获取:
同样可以在 spaceId 获取,API endpoint 下面就是 endpoint
(2)SDK 的鉴权
只需要调用 my. serverless.init() 这个接口,就可以自动完成鉴权
App({
async onLaunch{options}{
//第一次打开
//option.query=={number=1}
await my.serverless.init();
console.info(‘App onLaunch’);
}
如果不知道是否有鉴权失败的可能,可以将参数返回:
App({
async onLaunch{options}{
//第一次打开
//option.query=={number=1}
const res=await my.serverless.init();
console.log(res)
console.info(‘App onLaunch’);
}
获取参数,此时可以知道该接口返回是成功的(提供 success 自愿,对信息做异常处理):
四、实战:云资源调用
在使用之前需要有云资源才能访问云函数
1.云函数的创建
点击新建云函数,输入名称,选择运行环境(这里新建了一个名为 helloServerless 的云函数)
2. 云资源的创建
可以在本地编写一个云函数的包,更新 js 代码后部署该代码,这样完成一个云资源的创建。
提供的一个简单云函数:
module.exports=async(ctx)=>{
const {name}=ctx.agrs;
return ‘hello world ${name}’;
该云函数有一个入参,名为 name ,返回的是一个字符串 hello world ${name}
强调:
本地编写的云函数一定要用 index.js 命名,并且打包要作为一个同名的 zip 文件打包(例如,云函数为 helloServerless ,则该代码必须为 index.js 代码,打包后为 helloServerless.zip )
演示:
第一次可能是上传,这里是更新 js 代码
然后点击部署:
部署成功后执行该代码:
点击确定,可以看到执行结果:
3.在 SDK 如何使用云资源
如果将 demo 下载完成后,可以根据以下步骤共同操作
打开 index.js 文件
(该 demo 是云函数SDK 的一些样例)
该处为 Serverless SDK 的使用规则:
例如,该云函数是使用 function 的功能群,调用时是使用名字 helloServerless,第二个参数是入参,这里是 name:’小明’。 返回结果为 requestId,result和success,可以将 result 信息提出,接口都是 promise 接口,写法可以根据自己喜好。
部分代码:
async callCloundFunction(){
const res=await my.serverless.function.invoke(“helloServerless”,{name:’小明‘});
this.setData({
functionResult:result
)}
}
执行后:
可以打印看网络请求的包
结果为:
也可以看到SDK 完整的返回结果:
部分代码:
async callCloundFunction(){
const res=await my.serverless.function.invoke(“helloServerless”,{name:’小明‘})
}
返回结果:
4.云数据库创建
新建数据表:
以 json 形式添加记录:
5.云数据库调用
这里提供了增删改查4个简单的示例
先看4个接口
(1)find 接口(查询):
db ,云数据库的功能群,db 下的 collection 去指定数据库的目标(这里是 hello),如何去指定一个方式 find。
age: (sgt:9) 是Mongo 筛选的一个格式,意思是筛选年龄大于9的记录。
find 接口是查询多个接口:
这里将4个年龄大于9的记录打印了
与 find 接口类似,有一个 叫 findOne 接口
有时在业务逻辑中只需要找到一条符合要求的记录,就可以使用该接口:
用法与 find 接口类似,筛选的格式为 age: (sgt:9)
效果为:
(2)insertOne接口(增加)
插入一条数据,只需要写入插入信息
该插入接口无返回值,可以通过查询多条记录看到插入的信息:
(3)updateOne 接口(更新)
首先筛选,这里筛选的是 name:’小伊’ 的对象,然后是如何去处理 update 的操作,这里使用 Mongo 中的 set 。这里将对象的 age 改为11
效果:
(4)deleteOne 接口(删除)
与插入一样,先筛选要删除的信息,这里删除 name为 ‘小伊’的一条记录
效果:
小伊这条记录被删除
6.聚合操作
聚合操作可以多表名查,Sgroup 的操作
示例为 Sgroup 的操作
Sgroup:
{
_id:null
total={$sum:”$age”}
}
该代码表示没有规则的分组,去统计所有 age 的值
返回的对象是 age 和 id
第二部步使用了投影的操作:
Sproject:{
_id:0
}
可以将返回 id 、 age 或 sum ,不想要 id 这一项,就可以将 id 投影掉。(将 id 设置为0)
这样可以统计数据库中所有年龄之和:
7.用户信息
getInfo 接口
async getUserInfo(){
const{result:{user}}=await my.serverless.user.getInfo();
this.setData({
userResult: JSON.stringify(user)
})
},
查看该接口的返回内容:
注意:使用该接口时,其 result 不是直接将应该返回的信息平铺开,还封了一个 user 对象。
可以打印出来:
async getUserInfo(){
const res=await my.serverless.user.getInfo();
console.log(res)
}
结果为:
8.云存储使用
先在控制台创建云资源:
点击上传文件
上传后:
可以查看该文件信息:
五、课程总结
这节课理论部分较少,主要在进行一些配置。主要学习两部分,一部分是作为一个开发者如何去接入 EMAS Serverless ,EMAS Serverless 的开发准备,该部分主要有两个大的准备,是开通支付宝小程序的支付宝账号及把开发者账号与 IDE 进行关联和 EMAS Serverless 密钥配置(将支付宝小程序开发者信息和支付宝公钥,包括应用的私钥配置到 EMAS Serverless 的控制台)。
完成这两部分才能去完成在代码层面上的 Serverless SDK 的集成。第二部分是讲 Serverless SDK 使用的优点,例如可以饱和,可以将鉴权这一层面的内容屏蔽给使用者,从而很简单的使用 Serverless 的资源。
然后介绍了 SDK 的四个功能块(云函数、云数据库、云存储、用户信息)的访问和使用。最后以一个实际的 demo 串讲了SDK 的使用方式,包括 SDK 如何在一个项目中去集成和使用,如何根据项目的接口规范去使用云函数、云数据库。
课后:打卡任务
01小程序密钥配置
02在控制台创建并调用云函数
03在控制台创建数据库表
04在控制台云存储上传图片