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

本文介绍了微信小程序中云函数和数据库操作的概念,包括云函数的定义和数据库操作的特点,并通过实际项目展示了如何在云端进行数据的增、查、改操作。强调了在涉及用户数据交互时,推荐将数据库操作放在云端以确保安全性。同时,提供了云函数的依赖安装和使用步骤。
摘要由CSDN通过智能技术生成

QQ群招募中646258285(招募中,没几个人说话),
需要交流的朋友可以直接加我微信( DntBeliv )或QQ( 1121864253 )

转载自:https://blog.csdn.net/weixin_38604274/article/details/92406807#0202%20%E5%A2%9E%E6%9F%A5%E6%94%B9


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

目录

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

云函数

数据库操作

数据类型

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

02 项目实操部分

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

0202 增查改


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

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

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

  • 云函数

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

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

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

  • 数据库操作

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

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

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

  • 数据类型

官方介绍数据类型

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

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

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

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

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

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

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

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

查询>20条

		<p>(不记得上限是100条还是无)</p>
		</td>
	</tr><tr><td>3</td>
		<td>权限限制</td>
		<td>
		<p>=用户端。</p>

		<p> </p>

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

		<p>(数据库权限设置见下图)</p>

		<p>权限依据是第1条中自动附上的_openid</p>
		</td>
		<td>
		<p>=管理端。</p>

		<p> </p>

		<p>操作者视为管理端身份,可对数据增删改查</p>
		</td>
	</tr></tbody></table><p>我的相关参考条目:</p>

使用小程序云函数查询集合突破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 =&gt; {
    app.globalData.followID = "";
    wx.showToast({
      icon: 'none',
      title: '出错啦!请稍后重试'
    })
    console.error
  }</code></pre>

查询订单状态(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 =&gt; {
    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 =&gt; {
    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
  }
});

},


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值