E企盈营销工具技术服务商 热线:4006-838-530

微信小程序|云函数上的数据库操作

E企盈直播平台营销卖货系统

前阵子做了个微信小程序的项目,这次来主要讲讲云函数上的数据库操作。本文将按照以下顺序进行讲解:目录 00 什么是云函数和数据库操作云函数数据库操作数据类型01 小程序端与云端数据库操作的比较02 项目实操部分0201 小白部分(可跳过直接看0202)0202 增查改增查改 00 什么是云函数和数据库操作小程序的入门学习建议:以微信小程序的开发文档为准,结合网上代码案例进行练习。下面简单说一下云函数和数据库操作。云函数先看看官方介绍:云开发之云函数。简单来说,就是将函数放在了云端(服务器端),在小程序端进行调用。上面图中红框内的都最好过一下,代码部分的需要上手去敲。但官方文档还是不够,感觉有些细节问题会被省略掉,需要再度一下网友们的解决方法。数据库操作官方文档:云开发之数据库。与平时操作的MySQL、Oracle不同,小程序中的 “ 数据库表 ” 叫 “数据库集合 ” 。不强制要求固定的字段(即,列):对比下上面3条数据的字段(红框画出的),集合的随意性可见一般。数据类型官方介绍数据类型。GeoPoint不见得是数据库中常见的数据类型。官方文档说,GeoPoint是表地理位置点,记录经纬度,简单理解为某点坐标(x,y)吧。虽有打算用,但没有实际用上。GeoPoint就不详细讲了。 01 小程序端与云端数据库操作的比较数据库操作放在小程序端和云端有什么区别?如果涉及『其他用户可以改动别人创建的数据』这种情况的话,建议将数据库操作放在云端。(一般来说还是这种情况是偏多的,建议直接放在云端) 下图表是个人总结的二者的比较: 编号关键词小程序端云端1_openid新插入的数据会自动附上用户的_openid新插入的数据不会附上用户的_openid2条数限制查询上限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 增查改由于本次项目中没有进行删除操作,在此只介绍对数据的增、查、改。增发起订单云端:// 云函数入口文件const cloud = require(‘wx-server-sdk’)cloud.init();const db = cloud.database();//注意,不是wx.cloud.database(),这种是小程序端操作数据库的写法。云端没有“wx.”// 云函数入口函数exports.main = async (event, context) => {  const wxContext = cloud.getWXContext()//目的:获取_openid  try {    return await db.collection(“order”).add({      data: {        normalUser: wxContext.OPENID,//获取操作者_openid的方法        recycleUser: ”,        acceptTime:”,        followID:event.followID,        cancelTime:”,        orderType: event.orderType,        wasteType: event.wasteType,        recycleTime: event.recycleTime,        recycleLocate1: event.recycleLocate1,        recycleLocate2: event.recycleLocate2,        service: event.service,        serviceDetail: event.serviceDetail,        weight: event.weight,        acceptPrice1: event.acceptPrice1,        acceptPrice2: event.acceptPrice2,        createTime: event.createTime,        orderState: “待接单”,        doneTime: event.doneTime,        peopleNum: 1,        sellerName: event.sellerName,        tele: event.tele,        img: event.img,        distance: event.distance,        lat: event.lat,        lng: event.lng      }, success: res => {        //wx.showToast({         // title: ‘订单发起成功’,        //})      }, fail: err => {        //wx.showToast({          //icon: ‘none’,          //title: ‘订单发起失败’,        //})      }    })  } catch (e) {    console.log(e)  }}小程序端调用:     const db = wx.cloud.database();    wx.cloud.callFunction({      name: ‘orderAdd’,      data: {        normalUser : app.globalData._openid,        //上门这句。这样子其实传不了_openid,        //???(不知道为什么,手机端的话是传不了,查数据库见到会是空值;但调试时是可以传的,数据库里会有相应的值。有点迷,留个坑)        //_openid的存储需要通过在云端通过wx.Context获取(就是上面云端的做法)        followID:app.globalData.followID,        orderType: e.detail.value.orderType,        wasteType: e.detail.value.wasteType,        recycleLocate1: e.detail.value.recycleLocate1,        recycleLocate2: e.detail.value.recycleLocate2,        recycleTime: e.detail.value.recycleTime,        service: e.detail.value.service,        serviceDetail: e.detail.value.serviceDetail,        weight: e.detail.value.weight,        acceptPrice: e.detail.value.acceptPrice1 + “~” + e.detail.value.acceptPrice2 ,        buyerID: ”,        createTime: util.formatTime(new Date()),        orderState: ‘待接单’,        doneTime: ”,        peopleNum: 1,        sellerName: e.detail.value.sellerName,        tele: e.detail.value.tele,        img: ‘cloud://pinsoso-ide.7069-pinsoso-ide/rubbish1.jpg’,        distance: ‘0.2’,        lat: this.data.lat,        lng: this.data.lng      }, success: res => {        console.log(‘已添加至订单’)        wx.showToast({          duration:4000,          title: ‘新订单添加成功’        })      },       fail: err => {        app.globalData.followID = “”;        wx.showToast({          icon: ‘none’,          title: ‘出错啦!请稍后重试’        })        console.error      }查查询订单状态(orderState)为“待接单”&&订单类型(orderType)为“拼单”&&followID为空的订单云端:云函数orderQuery// 云函数入口文件const cloud = require(‘wx-server-sdk’)cloud.init()const db = cloud.database()// 云函数入口函数//查询”附近拼单”exports.main = async (event, context) => {  try {    //order      return await db.collection(‘order’).where({      //下面这3行,为筛选条件      orderState:”待接单”,      orderType:”拼单”,      followID:”    }).get({      success: function (res) {        return res      }    });  } catch (e) {    console.error(e);  }}小程序端:    //查询附近拼单        wx.cloud.init({          traceUser: true        })        wx.cloud.callFunction({          name: ‘orderQuery’,          complete: res => {            console.log(“***orderQuery”);            this.setData({              nearbyOrder: res.result.data,            })          }        });改修改订单状态为“已完成”,还要更新订单的完成时间云端:云函数orderUpdatetoRecycleDone// 云函数入口文件const cloud = require(‘wx-server-sdk’)cloud.init()const db = cloud.database();// 云函数入口函数exports.main = async (event, context) => {  try {    //这里的update依据是event._id    return await db.collection(“order”).doc(event._id).update({      data: {        doneTime: event.doneTime,//订单完成时间        orderState: “已完成”//订单状态      }    })  } catch (e) {    console.error(e)  }}小程序端:  //完成订单  orderDone: function (e) {    //改变order的orderState从”待完成”到”已完成”    console.log(“orderDone这里改变接单状态”)        //调用云函数    wx.cloud.callFunction({      name: ‘orderUpdatetoRecycleDone’,      data: {        _id: app.globalData._detailpage,        doneTime: util.formatTime(new Date())      },      success: res => {        console.log(“***完成订单:ok”)        //刷新页面数据        wx.showToast({          title: ‘完成订单’,          duration: 2000,          success: function () {            //设置延时执行            setTimeout(function () {                            //关闭当前页面,返回并刷新上一级页面———————–              var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序              var prePages = pages[pages.length – 1];//获取到上一个页面对象              prePages.onShow();//执行上一个页面对象中的刷新数据方法              //返回上一级页面              wx.navigateBack({                delta: 1,              })            }, 3000) //延迟时间          }        })      },      fail: err => {        console.log(“***完成订单:no”)        wx.showToast({          icon: ‘none’,          title: ‘出错啦!请稍后重试’,          duration: 2000,          success: function () {            setTimeout(function () {              //要延时执行的代码              //关闭当前页面,返回并刷新上一级页面———————–              var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序              var prePages = pages[pages.length – 1];//获取到上一个页面对象              prePages.onShow();//执行上一个页面对象中的刷新数据方法              //返回上一级页面              wx.navigateBack({                delta: 1,              })            }, 3000) //延迟时间          }        })        console.error      }    });  }, 若是有不对的地方劳烦各种指正!或有不同见解也欢迎留言交流~鞠躬~微信小程序

赞(0) 打赏
未经允许不得转载:E企盈小程序开发-热线:4006-838-530 » 微信小程序|云函数上的数据库操作
分享到: 更多 (0)
E企盈小程序直播营销卖货系统
E企盈直播平台营销卖货系统

评论 抢沙发

E企盈小程序开发

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏