当前位置:   article > 正文

微信小程序 | 云函数上的数据库操作_微信小程序 云函数 db.deletecollection

微信小程序 云函数 db.deletecollection

前阵子做了个微信小程序的项目,这次来主要讲讲云函数上的数据库操作。本文将按照以下顺序进行讲解:

目录

 

00 什么是云函数和数据库操作

云函数

数据库操作

数据类型

01 小程序端与云端数据库操作的比较

02 项目实操部分

0201 小白部分(可跳过直接看0202)

0202 增查改


 

00 什么是云函数和数据库操作

小程序的入门学习建议:以微信小程序的开发文档为准,结合网上代码案例进行练习。

下面简单说一下云函数和数据库操作。

  • 云函数

先看看官方介绍:云开发之云函数

简单来说,就是将函数放在了云端(服务器端),在小程序端进行调用。

上面图中红框内的都最好过一下,代码部分的需要上手去敲。但官方文档还是不够,感觉有些细节问题会被省略掉,需要再度一下网友们的解决方法。

  • 数据库操作

官方文档:云开发之数据库

与平时操作的MySQL、Oracle不同,小程序中的 “ 数据库表 ” 叫 “数据库集合 ” 。不强制要求固定的字段(即,列):

对比下上面3条数据的字段(红框画出的),集合的随意性可见一般。

  • 数据类型

官方介绍数据类型

GeoPoint不见得是数据库中常见的数据类型。官方文档说,GeoPoint是表地理位置点,记录经纬度,简单理解为某点坐标(x,y)吧。

虽有打算用,但没有实际用上。GeoPoint就不详细讲了。

 

01 小程序端与云端数据库操作的比较

  • 数据库操作放在小程序端和云端有什么区别?

如果涉及『其他用户可以改动别人创建的数据』这种情况的话,建议将数据库操作放在云端。

(一般来说还是这种情况是偏多的,建议直接放在云端)

 

下图表是个人总结的二者的比较:
 

编号关键词小程序端云端
1_openid新插入的数据会自动附上用户的_openid新插入的数据不会附上用户的_openid
2条数限制查询上限20条

查询>20条

(不记得上限是100条还是无)

3权限限制

=用户端。

 

操作者视为小程序端的用户/创建者身份,对数据的读写权限受限

(数据库权限设置见下图)

权限依据是第1条中自动附上的_openid

=管理端。

 

操作者视为管理端身份,可对数据增删改查

我的相关参考条目:

使用小程序云函数查询集合突破20条限制

 

  • 数据库权限设置:

(点开开发者工具左上角的“云开发”按钮可以进入到下图所示控制台)

官方文档:数据库权限设置说明 

 

02 项目实操部分

0201 小白部分(可跳过直接看0202)

下面对云端操作数据库(增查改)进行介绍:

在正式用云函数之前,需要进行的设置。

首先要进行云函数的依赖安装,当时我参考的博文:微信小程序云开发 | 云函数安装依赖

 

我这里再自己写写过程:

(1)对云函数的文件夹右键,点击“新建Node.js云函数”

(2)出现新生成的云函数文件夹,这时候图标还是文件夹而不是云

(3)对这个新生成的文件夹右键,选择“在终端打开”

(4)这时候出现命令窗,粘贴下面这行代码上去,回车执行:

npm install --save wx-server-sdk@latest

依赖安装好后的命令窗:

这时候看刚刚的文件夹,图标已经变成了云,且文件夹下多了个package-lock.json文件

(5)收尾工作

写好云函数后记得上传,要是有新的改动也要重新上传

0202 增查改

由于本次项目中没有进行删除操作,在此只介绍对数据的增、查、改。

发起订单

  • 云端:
  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init();
  4. const db = cloud.database();//注意,不是wx.cloud.database(),这种是小程序端操作数据库的写法。云端没有“wx.”
  5. // 云函数入口函数
  6. exports.main = async (event, context) => {
  7. const wxContext = cloud.getWXContext()//目的:获取_openid
  8. try {
  9. return await db.collection("order").add({
  10. data: {
  11. normalUser: wxContext.OPENID,//获取操作者_openid的方法
  12. recycleUser: '',
  13. acceptTime:'',
  14. followID:event.followID,
  15. cancelTime:'',
  16. orderType: event.orderType,
  17. wasteType: event.wasteType,
  18. recycleTime: event.recycleTime,
  19. recycleLocate1: event.recycleLocate1,
  20. recycleLocate2: event.recycleLocate2,
  21. service: event.service,
  22. serviceDetail: event.serviceDetail,
  23. weight: event.weight,
  24. acceptPrice1: event.acceptPrice1,
  25. acceptPrice2: event.acceptPrice2,
  26. createTime: event.createTime,
  27. orderState: "待接单",
  28. doneTime: event.doneTime,
  29. peopleNum: 1,
  30. sellerName: event.sellerName,
  31. tele: event.tele,
  32. img: event.img,
  33. distance: event.distance,
  34. lat: event.lat,
  35. lng: event.lng
  36. }, success: res => {
  37. //wx.showToast({
  38. // title: '订单发起成功',
  39. //})
  40. }, fail: err => {
  41. //wx.showToast({
  42. //icon: 'none',
  43. //title: '订单发起失败',
  44. //})
  45. }
  46. })
  47. } catch (e) {
  48. console.log(e)
  49. }
  50. }
  • 小程序端调用:
  1. const db = wx.cloud.database();
  2. wx.cloud.callFunction({
  3. name: 'orderAdd',
  4. data: {
  5. normalUser : app.globalData._openid,
  6. //上门这句。这样子其实传不了_openid,
  7. //???(不知道为什么,手机端的话是传不了,查数据库见到会是空值;但调试时是可以传的,数据库里会有相应的值。有点迷,留个坑)
  8. //_openid的存储需要通过在云端通过wx.Context获取(就是上面云端的做法)
  9. followID:app.globalData.followID,
  10. orderType: e.detail.value.orderType,
  11. wasteType: e.detail.value.wasteType,
  12. recycleLocate1: e.detail.value.recycleLocate1,
  13. recycleLocate2: e.detail.value.recycleLocate2,
  14. recycleTime: e.detail.value.recycleTime,
  15. service: e.detail.value.service,
  16. serviceDetail: e.detail.value.serviceDetail,
  17. weight: e.detail.value.weight,
  18. acceptPrice: e.detail.value.acceptPrice1 + "~" + e.detail.value.acceptPrice2 ,
  19. buyerID: '',
  20. createTime: util.formatTime(new Date()),
  21. orderState: '待接单',
  22. doneTime: '',
  23. peopleNum: 1,
  24. sellerName: e.detail.value.sellerName,
  25. tele: e.detail.value.tele,
  26. img: 'cloud://pinsoso-ide.7069-pinsoso-ide/rubbish1.jpg',
  27. distance: '0.2',
  28. lat: this.data.lat,
  29. lng: this.data.lng
  30. }, success: res => {
  31. console.log('已添加至订单')
  32. wx.showToast({
  33. duration:4000,
  34. title: '新订单添加成功'
  35. })
  36. },
  37. fail: err => {
  38. app.globalData.followID = "";
  39. wx.showToast({
  40. icon: 'none',
  41. title: '出错啦!请稍后重试'
  42. })
  43. console.error
  44. }

查询订单状态(orderState)为“待接单”&&订单类型(orderType)为“拼单”&&followID为空的订单

  • 云端:

云函数orderQuery

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init()
  4. const db = cloud.database()
  5. // 云函数入口函数
  6. //查询"附近拼单"
  7. exports.main = async (event, context) => {
  8. try {
  9. //order
  10. return await db.collection('order').where({
  11. //下面这3行,为筛选条件
  12. orderState:"待接单",
  13. orderType:"拼单",
  14. followID:''
  15. }).get({
  16. success: function (res) {
  17. return res
  18. }
  19. });
  20. } catch (e) {
  21. console.error(e);
  22. }
  23. }
  • 小程序端:
  1. //查询附近拼单
  2. wx.cloud.init({
  3. traceUser: true
  4. })
  5. wx.cloud.callFunction({
  6. name: 'orderQuery',
  7. complete: res => {
  8. console.log("***orderQuery");
  9. this.setData({
  10. nearbyOrder: res.result.data,
  11. })
  12. }
  13. });

修改订单状态为“已完成”,还要更新订单的完成时间

  • 云端:

云函数orderUpdatetoRecycleDone

  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init()
  4. const db = cloud.database();
  5. // 云函数入口函数
  6. exports.main = async (event, context) => {
  7. try {
  8. //这里的update依据是event._id
  9. return await db.collection("order").doc(event._id).update({
  10. data: {
  11. doneTime: event.doneTime,//订单完成时间
  12. orderState: "已完成"//订单状态
  13. }
  14. })
  15. } catch (e) {
  16. console.error(e)
  17. }
  18. }
  • 小程序端:
  1. //完成订单
  2. orderDone: function (e) {
  3. //改变order的orderState从"待完成"到"已完成"
  4. console.log("orderDone这里改变接单状态")
  5. //调用云函数
  6. wx.cloud.callFunction({
  7. name: 'orderUpdatetoRecycleDone',
  8. data: {
  9. _id: app.globalData._detailpage,
  10. doneTime: util.formatTime(new Date())
  11. },
  12. success: res => {
  13. console.log("***完成订单:ok")
  14. //刷新页面数据
  15. wx.showToast({
  16. title: '完成订单',
  17. duration: 2000,
  18. success: function () {
  19. //设置延时执行
  20. setTimeout(function () {
  21. //关闭当前页面,返回并刷新上一级页面-----------------------
  22. var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序
  23. var prePages = pages[pages.length - 1];//获取到上一个页面对象
  24. prePages.onShow();//执行上一个页面对象中的刷新数据方法
  25. //返回上一级页面
  26. wx.navigateBack({
  27. delta: 1,
  28. })
  29. }, 3000) //延迟时间
  30. }
  31. })
  32. },
  33. fail: err => {
  34. console.log("***完成订单:no")
  35. wx.showToast({
  36. icon: 'none',
  37. title: '出错啦!请稍后重试',
  38. duration: 2000,
  39. success: function () {
  40. setTimeout(function () {
  41. //要延时执行的代码
  42. //关闭当前页面,返回并刷新上一级页面-----------------------
  43. var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序
  44. var prePages = pages[pages.length - 1];//获取到上一个页面对象
  45. prePages.onShow();//执行上一个页面对象中的刷新数据方法
  46. //返回上一级页面
  47. wx.navigateBack({
  48. delta: 1,
  49. })
  50. }, 3000) //延迟时间
  51. }
  52. })
  53. console.error
  54. }
  55. });
  56. },

 


若是有不对的地方劳烦各种指正!或有不同见解也欢迎留言交流~

鞠躬~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/570720
推荐阅读
相关标签
  

闽ICP备14008679号