电子商务网站建设教学总结,成都制作网页设计,朵朵软件网站建设,设计师入驻平台一、概念1. 传统开发模式2. 新开发模式 ( 云开发模式 )3. 传统、云开发的模式对比4. 传统、云开发的项目流程对比5. 云开发的定位1. 个人的项目或者想法#xff0c;不想开发服务器#xff0c;直接使用云开发2. 某些公司的小程序项目是使用云开发的#xff0c;但是不多#…一、概念1. 传统开发模式2. 新开发模式 ( 云开发模式 )3. 传统、云开发的模式对比4. 传统、云开发的项目流程对比5. 云开发的定位1. 个人的项目或者想法不想开发服务器直接使用云开发2. 某些公司的小程序项目是使用云开发的但是不多大部分还是用自己的服务器3. 可以让我们了解一些云开发的思想比如服务器、数据库、存储有利于之后学习服务器相关知识6. 云开发核心技术云开发主要包含三大核心技术 : 云数据库、云存储、云函数云数据库提供在小程序端直接对数据库进行增删改查的能力数据库是类似于MongoDB的文档存储的数据库操作非常方便非常简单不是关系数据库可以直接往里面存储JSON对象云存储可以在小程序端直接上传、下载、删除文件自带CDN提高文件访问速度可以获取临时链接支持在小程序外访问云函数提供了在服务器代码的执行能力包含微信天然的私有鉴权更大权限的操作数据库等进行云调用、HTTP请求等操作二、创建云开发项目1. 创建项目2. 了解云开发01 - 打开云开发02 - 创建云开发环境新建新环境设置 – 环境名称 – 创建环境03 - 云开发控制台运营分析数据库云数据库存储云存储云函数04 - 环境与配额环境一个环境对应一整套独立的云开发资源包括数据库、存储空间、云函数等资源各个环境是相互独立的用户开通云开发后即创建了一个环境默认可拥有最多两个环境在实际开发中建议多配备几个环境测试环境预发环境线上环境配额可以根据自己的业务量选择对应的更高配额网址 : 配额3. 云开发项目初始化在小程序端开始使用云能力前需先调用 wx.cloud.init 方法完成云能力初始化01 - 在app.js 中初始化// app.js
App({onLaunch: function () {// 1. 判断是否有云开发能力if (!wx.cloud) {console.error(请使用 2.2.3 或以上的基础库以使用云能力);} else {// 2. 初始化云开发wx.cloud.init({/*** env* env 参数决定接下来小程序发起的云开发调用wx.cloud.xxx会默认请求到哪个云环境的资源* 此处请填入环境 ID, 环境 ID 可打开云控制台查看*/env: my-env-id,/*** traceUser* 是否要跟踪用户* 打开后可在 云开发控制台 - 运营分析 - 用户访问观看到访问列表*/traceUser: true,});}this.globalData {};}
});
02 - 路径可进行配置三、云数据库1. 概念网址 : 微信开发文档 - 云数据库数据库介绍JSON数据库云开发提供了一个文档型数据库类似于MongoDB里面存放的是一条条JSON格式的对象一个数据库可以包含多个集合一个集合中包含多个JSON对象提供方便的API调用学习这些API即可提供了小程序端和服务器端云函数中调用的区分数据库集合的权限若想每个人都 可读 且 可写 2. 操作数据库 – 控制台操作01 - 打开02 - 创建集合相当于是一个数组 []03 - 创建一条数据 ( 记录 )相当于是数组 [] 中的一条数据默认模式JSON模式04 - 导入数据3. 操作数据库 - 代码操作// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)增加数据在数据库中刷新即可看到新增加的数据ps : 代码添加的数据_openid字段也会新增上作为唯一标识获取操作后的回调结果基于回调传入success、fail、complete基于Promise使用then、catch、finally添加单条数据// 1. 获取对应的数据库
const db wx.cloud.database()
// 2. 获取到要操作的集合 (collection)
const stuCollect db.collection(students)Page({// 新增数据addData() {stuCollect.add({// 数据data: {name: 小王,age: 20,hobbies: [bvvv],address: {alias: HB,name: 湖北,code: 333343}},// 可以使用回调函数success: ({ errMsg }) {if (errMsg collection.add:ok) {wx.showToast({title: 添加成功,})}}})// // 也可以使用promise// .then((res) { console.log(res) })}
})循环添加数据// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({// 增加数据onAdd() {// 请求10页的数据for (let i 1; i 10; i) {wx.request({// 测试用途 : 抓取下某鱼的数据url: https://m.douyu.com/api/room/list,data: {page: i,type: yz},success: (res) {const list res.data.data.listthis.addData(list)}})}},addData(list) {list.forEach(item {// 循环添加数据yzCollect.add({data: item}).then(() {console.log(${item.roomName}:添加成功);})})},
})删除数据根据 id 删除// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)Page({onDelete() {// 3. 根据id删除某一条数据 id去数据库里看即可stuCollect.doc(a64480e663f0753e000826875146d365).remove().then(res {console.log(res);})}
})根据 条件 删除// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)Page({// 3. 根据条件删除数据onDelete() {// 删除 名称 coder 的数据stuCollect.where({name: coder}).remove().then(res {console.log(res);})// 删除 年龄 大于16岁 的数据// 01.拿到查询指令const cmd db.commandstuCollect.where({// 02.使用查询指令 gt lt age: cmd.gt(16)}).remove().then(res {console.log(res);})}
})修改数据修改单条数据更新数据update : 更新增加某一个字段// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)Page({// 修改onEdit() {stuCollect.doc(632b810463f08152000634f45aa33965)// update : 修改某一个字段.update({data: {age: 99}}).then(res {console.log(res);})}
})替换数据set : 使用新对象替换原来对象// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)Page({// 修改onEdit() {stuCollect.doc(2cc84e2663ef492f00c7ecda28da87f4)// set : 原数据被全部替换.set({data: {age: 99}}).then(res {console.log(res);})}
})修改多条数据// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const stuCollect db.collection(students)Page({// 修改onEdit() {// 拿到查询指令const cmd db.commandstuCollect.where({// 条件 : 年龄小于30岁的人age: cmd.lt(30)}).update({data: {age: 20}}).then(res {console.log(res);})}
})查找数据查询数据的方式 : 方式一通过ID查询精确的某一条数据使用doc查询ID方式二根据条件查询满足条件的数据使用where作为条件方式三通过指令过滤数据使用db.command的指令eq 等于neq 不等于lt 小于lte 小于或等于gt 大于gte 大于或等于in 字段值在给定数组中 ( name : cmd.in[coder,star] )nin 字段值不在给定数组中方式四通过正则表达式匹配符合的数据使用db.RegExp创建正则规则方式五获取整个集合的数据小程序端一次性最多20条云函数中可以获取100条直接调用get方式六过滤、分页、排序查询数据使用field、skip、limit、orderBy方式一 : 精准查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({onQuery() {// 方式一 : 根据id查询某条数据yzCollect.doc(663f243e63f07f9700071256127340a0).get().then(({ data }) {console.log(data);})}
})方式二 : 条件查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({onQuery() {// 方式二 : 根据条件查询 查询到的是多条数据yzCollect.where({// 不是模糊查询但是可能是同名的nickname: 小野静奈,}).get().then(({ data }) {console.log(data); // [ {...} ]})}
})方式三 : 指令查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({onQuery() {// 方式三 : 查询指令 gt 大于 lt 小于// 01 - 获取查询指令const _ db.commandyzCollect.where({// 02 - 使用查询指令rid: _.lt(9000000),}).get().then(({ data }) {console.log(data); // [ {...},{...} ] 小程序端一次性最多返回20条可做分页查询})}
})方式四 : 正则查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({onQuery() {// 方式四 : 正则表达式查询 查询包含 字母z 的数据 模糊查询yzCollect.where({// nickname: db.RegExp({// regexp:z, // 包含z// options:i // 忽略大小写// }),nickname: /z/ig}).get().then(({ data }) {console.log(data); // [ {...},{...} ] 小程序端一次性最多返回20条可做分页查询})}
})方式五 : 集合查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({onQuery() {// 方式五 : 获取整个集合中的数据 直接getyzCollect.get().then(({ data }) {console.log(data); // [ {...},{...} ] 小程序端一次性最多返回20条可做分页查询})}
})方式六 : 综合查询// 1. 获取数据库对象
const db wx.cloud.database()
// 2. 获取操作的集合
const yzCollect db.collection(YZ)Page({// 方式六 : 综合查询/*** skip offset偏移量 跳过几条数据* limit size 拿几条数据* orderBy 排序des,方式 升序:asc | 降序 : desc* field 过滤字段 拿想要的数据字段*/// onQuery() {// 过滤字段 拿 _id,nickname,rid 三个字段.field({_id: true,nickname: true,rid: true})// 跳过0条数据.skip(0)// 拿5条数据.limit(5)// 排序 根据rid排序,升序.orderBy(rid, asc).get().then(({ data }) {console.log(data); // [ {_id:, nickname:, rid:},{...} ] })}
})4. 案例效果wxmlview classnavblock wx:for{{dataList}}wx:keyindexview classitemview classnoticeview sizeminiclassbtnbindtaptabEditdata-item{{item}}data-index{{index}}Edit/viewtext{{item.nickname}}/textview sizeminiclassbtnbindtaptabDeldata-item{{item}}data-index{{index}}Del/view/viewimage src{{item.roomSrc}}modewidthFix //view/block
/viewwxss.nav {padding: 20rpx;display: flex;flex-wrap: wrap;justify-content: space-between;
}.item {width: 48%;margin-bottom: 30rpx;border-radius: 40rpx;
}.notice {font-size: 30rpx;line-height: 40rpx;display: flex;align-items: center;justify-content: space-between;color: pink;
}.btn {font-size: 24rpx;color: gray;
}image {width: 100%;
}js// 获取数据库对象
const db wx.cloud.database()
// 获取集合
const yzCollect db.collection(YZ)
Page({data: {dataList: [],page: 0,pageSize: 10},onLoad() {this.getDataList()},// 上拉加载更多onReachBottom() {this.getDataList()},/*** 方法*/// 获取数据getDataList() {const { page, pageSize, dataList } this.datayzCollect.field({nickname: true,roomName: true,roomSrc: true,}).skip(page * pageSize).limit(pageSize).get().then(({ data }) {console.log(data);// 保存数据this.setData({dataList: [...dataList, ...data]})this.data.page page 1})},// 编辑async tabEdit(e) {const { item, index } e.currentTarget.datasetconst newName item.nickname Q// 更改数据库数据const { errMsg } await yzCollect.doc(item._id).update({data: {nickname: newName}})if (errMsg ! document.update:ok) {return wx.showToast({title: 修改失败,icon: none})}// 更改页面中数据this.setData({[dataList[ index ].nickname]: newName})wx.showToast({title: 修改成功,icon: none})},// 删除async tabDel(e) {const { item, index } e.currentTarget.dataset// 删除数据库数据const { errMsg } await yzCollect.doc(item._id).remove()if (errMsg ! document.remove:ok) {return wx.showToast({title: 删除失败,icon: none})}// 删除页面中数据this.data.dataList.splice(index, 1)this.setData({dataList: this.data.dataList})wx.showToast({title: 删除成功,icon: none})// 判断当前页面数量是否小于pageSize在第一页时可能会出现镂空现象if (this.data.dataList.length this.data.pageSize) {this.getDataList()}},
})四、云存储1. 概念网址 : 微信开发文档 - 云存储云存储用于将文件存储到云端 : 云存储提供高可用、高稳定、强安全的云端存储服务持任意数量和形式的非结构化数据存储如视频和图片并在控制台进行可视化管理云存储常见的操作 :上传文件到云存储中图片、视频、音频等等都可以获取文件的临时链接在外网可以访问下载文件到本地本地文件缓存将云存储中的文件删除2. 操作云存储 - 控制台操作01 - 上传图片、视频、音频等02 - 页面展示3. 操作云存储 - 代码操作上传操作Page({data: {imagePath: },// 上传文件async onUploadTap() {// 1. 选中本地文件( 相册、拍照 )const { type, errMsg, tempFiles } await wx.chooseMedia({// 设定一次只能传一张图片count: 0})if (errMsg ! chooseMedia:ok) {return wx.showToast({title: 上传失败,})}console.log(type, errMsg, tempFiles);// 2. 获取照片const imagePath tempFiles[0].tempFilePath// 3. 因为图片名称容易重复所以这里设定一下const imageName this.setImageName(imagePath)// 4. 将照片上传到云存储中const uploadRes await wx.cloud.uploadFile({// 文件路径 文件名称如果在images文件家中前面带上即可 images/abc.pngcloudPath: images/ imageName,// 指定要上传的文件的小程序临时文件路径filePath: imagePath,})console.log(uploadRes);if (uploadRes.errMsg ! cloud.uploadFile:ok) {return wx.showToast({title: 上传失败,})}wx.showToast({title: 上传成功,})// 5. 页面展示this.setData({imagePath: uploadRes.fileID})},// 图片名称设定setImageName(imagePath) {// 1. 时间戳const timeStamp new Date().getTime()// 2. openidconst openid openid// 3. 文件后缀名 pop 拿到最后一个元素 const extension imagePath.split(.).pop()// 返回拼接名称return ${timeStamp}_${openid}.${extension}}
})下载操作Page({data: {imagePath: },// 一、点击下载onDownload() {// 1. 获取手机相册权限wx.authorize({scope: scope.writePhotosAlbum,success: () {// 2. 从云存储中获取下载的文件路径this.getDownPath()},fail: () {wx.showToast({title: 未授权请前往微信设置页面中打开授权,icon: none})}})},// 二、获取下载的文件地址async getDownPath() {// 根据fileID获取下载的文件路径const { errMsg, tempFilePath } await wx.cloud.downloadFile({// fileIDfileID: cloud://xuanyu-dev})if (errMsg ! downloadFile:ok) {return wx.showToast({title: 下载失败,icon: none})}// 3. 保存文件到手机相册this.saveFile(tempFilePath)// 也可展示到页面上this.setData({imagePath: tempFilePath})},// 三、保存文件到手机相册saveFile(filePath) {// 下载图片到手机本地wx.saveImageToPhotosAlbum({filePath,success: ({ errMsg }) {if (errMsg ! saveImageToPhotosAlbum:ok) {return wx.showToast({title: 下载失败,icon: none})}wx.showToast({title: 下载成功,icon: none})}})}
})删除操作Page({// 点击删除async onDelete() {const { errMsg } await wx.cloud.deleteFile({fileList: [// fileIDcloud://xuanyu-dev],})if (errMsg ! cloud.deleteFile:ok) {return wx.showToast({title: 删除失败,icon: none})}wx.showToast({title: 删除成功,icon: none})},
})临时链接为什么要获取临时链接 : 我们将文件上传到云存储后可以通过fileID在小程序中直接访问但是如果我们希望在小程序以外的地方访问比如浏览器、手机端,那么fileID是不可以的这个时候我们可以通过获取临时链接该链接可以在小程序以外访问注意文件链接有效期为两个小时Page({// 生成临时文件链接async onTemplate() {// 1. 请求临时链接const { errMsg, fileList } await wx.cloud.getTempFileURL({fileList: [// fileIDcloud://xuanyu-dev,cloud://xuanyu-dev],})if (errMsg ! cloud.getTempFileURL:ok) {return wx.showToast({title: 生成链接失败,icon: none})}// 2. 获取结果const resUrl fileList.map(item {return item.tempFileURL})console.log(resUrl);wx.showToast({title: 生成链接成功,icon: none})},
})五、云函数和云调用1. 概念云函数即在云端服务器端运行的函数 : 在物理设计上一个云函数可由多个文件组成占用一定量的CPU 内存等计算资源各云函数完全独立可分别部署在不同的地区开发者无需购买、搭建服务器只需编写函数代码并部署到云端即可在小程序端调用同时云函数之间也可互相调用云函数的编写方式 : 一个云函数的写法与一个在本地定义的 JavaScript 方法无异代码运行在云端 Node.js 中当云函数被小程序端调用时定义的代码会被放在Node.js 运行环境中执行可以如在 Node.js 环境中使用 JavaScript 一样在云函数中进行网络请求等操作而且还可以通过云函数后端 SDK搭配使用多种服务比如使用云函数 SDK 中提供的数据库和存储 API 进行数据库和存储的操作云开发的云函数的独特优势在于与微信登录鉴权的无缝整合 : 当小程序端调用云函数时云函数的传入参数中会被注入小程序端用户的 openid开发者无需校验 openid 的正确性因为微信已经完成了这部分鉴权开发者可以直接使用该 openid云函数作用 : 在云函数中对云数据库进行操作对结果进行某种转换再返回到小程序端在云函数中对云存储进行操作进行查询、上传、删除等操作向其他服务器发送请求请求到数据后再返回到小程序端云函数中对域名、ip没有限制. . . . . .2. 使用过程01 - 选择环境02 - 同步云函数03 - 下载代码到本地04 - 创建云函数05 - 编写代码逻辑// 云函数入口文件
const cloud require(wx-server-sdk)cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {return hello world
}06 - 将云函数上传到云端07 - 小程序中对云函数调用Page({async onLoad() {// 1. 调用云函数const { errMsg, requestID, result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: testFunc})console.log(result); // hello world}
})3. 基本使用案例 : 云函数来计算两个数字的和01 - 本地代码Page({async onLoad() {// 1. 调用云函数const { errMsg, requestID, result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: testFunc,// 3. 传入数据到云函数data: {num1: 10,num2: 20}})console.log(result); // 30}
})02 - 云函数代码// 云函数入口文件
const cloud require(wx-server-sdk)cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {// 1. 获取调用者传入的参数就是在data中传过来的参数// console.log(event); // 因为显示在云端所以这样是看不到结果的const { num1, num2 } event// 2. 返回结果return num1 num2
}03 - 部署云函数右键上传并部署即可4. 云函数代码调试云端测试缺点 : 看不到打印信息01 - 找到云函数02 - 云端测试本地调试01 - 找到云函数02 - 本地调试安装依赖开启成功重新请求更改代码5. 高级使用云函数 - 获取openID微信内部做好了身份鉴权在云函数中可直接拿到登录者的openIDopenid可以用于作为用户身份的标识符在云开发中可以获取用户openid来验证用户是否已经登录在云函数中获取微信调用上下文 : Cloud.getWXContext(): Object网址 : wxcloud云函数// 云函数入口文件
const cloud require(wx-server-sdk)cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
/*** event : 传递过来的参数* context : node运行环境上下文一般不会用到*/
exports.main async (event, context) {// 1. 获取到微信的上下文const wxContext cloud.getWXContext()return {event,openid: wxContext.OPENID,appid: wxContext.APPID,unionid: wxContext.UNIONID,}
}本地调用Page({async onLoad() {// 1. 调用云函数const { errMsg, requestID, result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: getOpenid,})console.log(errMsg, requestID, result); }
})云函数 – 操作云数据库小程序端口对数据库的操作有限制 : 小程序端一次最多获取20条数据 云函数最多100条小程序端一次性删除、修改多条数据可能会报警告 云函数中没有限制云函数// 云函数入口文件
const cloud require(wx-server-sdk)cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {// 1. 获取数据库const db cloud.database()// 2. 获取集合const _ db.collection(YZ)// 3. 从集合中查询数据return await _.get()
}本地调用Page({async onLoad() {// 1. 调用云函数const { result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: getYZdata,})console.log(result.data); // [{...}, {...}, {...}, ...]}
})云函数 – 操作云存储云函数// 云函数入口文件
const cloud require(wx-server-sdk)
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {// 1. 下载操作 下载下来文件不是地址不知道干嘛用的又不能保存在本地const { errMsg: downErrMsg, fileContent } await cloud.downloadFile({// fileIDfileID: cloud://xuanyu-dev})if (downErrMsg ! downloadFile:ok) {return downErrMsg}// return fileContent.toString(utf8)// 2. 删除操作const { errMsg: delErrMsg } await cloud.deleteFile({fileList: [cloud://xuanyu-dev],})if (delErrMsg ! deleteFile:ok) {return delErrMsg}return OK
}
本地调用Page({data: {qrCodeUrl: },async onLoad() {// 1. 调用云函数const { result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: fetchData,})console.log(result);}
})云函数 – 发送http请求对于小程序某些域名的限制无法配置时我们可以通过云函数作为代理来请求数据再返回给小程序端需要使用axios所以需安装ps : npm i axios0.27.2 如果安装高版本的可能会出问题返回的结果时如果出现以下问题可能是格式问题返回.data或者详细的数据即可云函数// 云函数入口文件
const cloud require(wx-server-sdk)
const axios require(axios)
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {// 1. 从其他服务器中请求数据const res await axios.get(http://www.baidu.com)// 2. 对数据进行转换// 3. 返回数据到小程序端 这里要返回.data 否则可能会报错return res.data
}本地调用Page({async onLoad() {// 1. 调用云函数const { result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: fetchData,})console.log(result);}
})云函数 – 生成小程序码网址 : 微信官方文档 - 生成二维码云函数// 云函数入口文件
const cloud require(wx-server-sdk)
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main async (event, context) {// 1. 生成小程序码const { contentType, errMsg: codeErrMsg, buffer } await cloud.openapi.wxacode.createQRCode({path: pages/cloud-database/index,width: 320})if (codeErrMsg ! openapi.wxacode.createQRCode:ok) {// 生成二维码失败return codeErrMsg}// 2. 获取图片数据上传到云存储中const timeStamp new Date().getTime()const openid cloud.getWXContext().OPENIDconst ext contentType.split(/).pop()const { errMsg: uploadErrMsg, fileID } await cloud.uploadFile({// 文件内容,注 : 这里没有filePathfileContent: buffer,cloudPath: qrcode_${timeStamp}_${openid}.${ext}});if (uploadErrMsg ! uploadFile:ok) {// 存储二维码失败return uploadErrMsg}// return fileID// 可直接返回fileID 或者多一步返回临时路径// 3. 获取图片临时路径const { errMsg: getTempErrMsg, fileList } await cloud.getTempFileURL({fileList: [fileID]})if (getTempErrMsg ! getTempFileURL:ok) {// 获取二维码失败return getTempErrMsg}// 4. 返回临时图片路径return fileList[0].tempFileURL
}
本地调用Page({data: {qrCodeUrl: },async onLoad() {// 1. 调用云函数const { result } await wx.cloud.callFunction({// 2. 指定调用哪个云函数name: fetchData,})this.setData({qrCodeUrl: result})console.log(result);}
})