这个作业属于哪个课程 | 2023软件工程实践W班 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 课程回顾与总结 个人技术总结 |
其他参考文献 | 《构建之法》 |
文章目录
一、技术概述
1、使用场景
- 微信小程序后端开发时使用
2、学习原因
- 分离数据库调用功能和程序功能,程序结构更加清晰。
- 使用云函数编写功能能够将功能细化,实现低内聚。
- 一次编写,可多次在不同js中调用,提高代码重用率。
3、技术难点
- 多表联合查询
二、技术详述
1、代码详解
1.1云环境配置
- 在项目下新建一个目录
- 指定该目录为云函数的跟目录
- 在项目的app.js文件中指定云开发的环境ID
1.2 新建云函数
-
在云函数根目录右键点击新建node.js云函数
-
在新建的云函数处右键在终端打开
-
编写云函数内容
1.3 常见云函数对于数据库的增删改查
- 增
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()//目的:获取_openid
try {
return await db.collection("order").add({
data: {
normalUser: wxContext.OPENID,//获取操作者_openid的方法
}
})
} catch (e) {
console.log(e)
}
}
- 删
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database();
const _ = db.command //引用指令
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection("order").where({
orderState:event.orderState,
})
.delete({
data: {
doneTime: event.doneTime,
orderState: "已完成"
}
})
} catch (e) {
console.error(e)
}
}
- 改
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database();
const _ = db.command //引用指令
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection("order").where({
orderState:event.orderState,
})
.update({
data: {
doneTime: event.doneTime,
orderState: "已完成"
}
})
} catch (e) {
console.error(e)
}
}
- 查
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
try {
return await db.collection('order' ).where({
orderState:event.orderState,
}).get();
} catch (e) {
console.error(e);
}
}
- 返回一个字段
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
try {
//order
return await db.collection('order').where({
orderState:"待接单",
})
.field({ 'name': true })
.get();
} catch (e) {
console.error(e);
}
}
- 多表联查
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database()
const $ = db.command.aggregate
// 云函数入口函数
exports.main = async (event, context) => {
return await db.collection('user_record').aggregate()
.lookup({
from: 'user',
localField:'open_id',
foreignField:'open_id',
as:'user',
})
.match({
game_record_id:event.game_record_id
})
.replaceRoot({
newRoot: $.mergeObjects([$.arrayElemAt(['$user', 0]), '$$ROOT'])
})
.project({
_id:0,
open_id:1,
user_name:1,
identity:1,
latitude:1,
longitude:1
})
.end()
}
2、流程图
三、问题与解决
问题一
- 描述:微信小程序编译后白屏
- 解决方法:对比之前开发工具的设置,发现不知何时多打了一个勾:使用独立域进行调试,去掉即可
问题二
- 描述:db.collection.count返回的对象如何提取所需要的数据
- 解决方法:通过查询官方文档可以知道,.count().get()返回的数据是一个对象,如果此时你需要提取它的数量时,可以使用.total属性
问题三
- 描述:云开发修复时区的问题——云函数中的时区是UTC+0,所有要手动设置时区为UTC+8
- 解决方法:
- 给对应的云函数设置时区:云开发–云函数–对应的云函数配置环境变量:TZ+Asia/Shanghai
- 使用where条件查询+get获取
- 使用Date()对象获取当前时间
- 给对应的云函数设置时区:云开发–云函数–对应的云函数配置环境变量:TZ+Asia/Shanghai
四、总结
- 微信小程序的开发学习相对其他新技术而言还是比较容易的,因为它的开发文档是中文的原因,很多自身遇到的问题都可以在微信开发文档中找到
- 使用云函数进行开发必须配置环境,否则会一直报错
- 因为云函数是共享的,因此每写完一个云函数想要使用它一定要记得上传,否则是无法使用的。
- 云函数中的名称必须一一对应,一旦名字不相同就会导致错误。