微信云开发之云函数小例子

news/2024/7/20 3:34:38 标签: 微信, 小程序, 云函数

环境

  • 微信开发者工具 Stable 1.06.2303220
  • 云开发控制台 v1.5.47

概述

云函数即在云端(服务器端)运行的函数,代码运行在云端Node.js中。我们可以使用云函数SDK中提供的数据库和存储API进行数据库和存储的操作。

云函数的独特优势在于与微信登录鉴权的无缝整合。当小程序端调用云函数时,云函数的传入参数中会被注入小程序端用户的 openid,开发者无需校验 openid 的正确性因为微信已经完成了这部分鉴权,开发者可以直接使用该 openid。

准备

微信开发者工具中,创建一个新项目 miniprogram-9 ,输入AppID,并选择“微信云开发”。

示例

示例1:Helloworld

右键单击 cloudfunctions ,选择“新建Node.js云函数”:

在这里插入图片描述

命名为“helloworld”,并回车,系统自动创建 helloworld 文件夹,以及 config.jsindex.jspackage.json 三个文件。

在这里插入图片描述

打开 index.js 文件,编辑如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  return 'Hello world!'
}

右键单击 index.js ,选择“云函数增量上传:更新文件”。

注意:云函数是在后台工作的,所以每次修改完云函数,别忘了要上传一下,否则修改不起作用。

打开“miniprogram -> pages -> index -> index.wxml”,把内容全部清空,并添加如下内容:

<button type="primary" bindtap="getHelloworld">Hi</button>
<view>{{dataObj}}</view>

打开“miniprogram -> pages -> index -> index.js”,添加/修改如下内容:

  data: {
    dataObj: ""
  },

  getHelloworld() {
    wx.cloud.callFunction({
      name: 'helloworld'
    })
    .then(res => {
      console.log(res)
      this.setData({
        dataObj: res.result
      })
    })
  },

测试效果如下,当点击查询按钮时,就会显示“Hello world!”:

在这里插入图片描述

示例2:操作数据库

添加云函数 getData ,修改其 index.js 如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

const db = cloud.database()

// 云函数入口函数
exports.main = async (event, context) => {
  return await db.collection('table0508').get()
}

编辑完后别忘了上传云函数

修改 index.wxml 文件如下:

<button type="primary" bindtap="getData">查询</button>

<view wx:for="{{dataObj}}" wx:key="index">
  <view>{{index + 1}}:</view>
  <view>姓名:{{item.name}}</view>
  <view>性别:{{item.sex}}</view>
  <view>年龄:{{item.age}}</view>
  <view>功夫:{{item.kongfu}}</view>
  <text>\n\n</text>
</view>

修改页面的 index.js 文件内容如下:

......
  data: {
    dataObj: ""
  },

  getData() {
    wx.showLoading({
      title: '加载中……',
      mask: true
    })
    wx.cloud.callFunction({
      name: 'getData',
    })
    .then(res => {
      console.log(res.result.data)
      this.setData({
        dataObj: res.result.data
      })
      wx.hideLoading()
    })
  },
......

测试效果如下,当点击“查询”按钮时,就会从后台获取数据:

在这里插入图片描述

示例3:触底加载新数据

如果数据量较大,则没必要一次性取回所有数据,可以考虑逐步获取数据。设计思路是:首先在页面加载时( onLoad ),从后台取回一部分数据(比如第1到3条),然后当页面到达底部时( onReachBottom),从后台再取回一部分数据(比如第4到6条),以此类推。

添加云函数 getLimitedData ,修改其 index.js 如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

const db = cloud.database()

// 云函数入口函数
exports.main = async (event, context) => {
  var limitNum = event.limitNum
  var skipNum = event.skipNum

  return await db.collection('table0508').limit(limitNum).skip(skipNum).get()
}

修改 index.wxml 如下:

<view wx:for="{{dataObj}}" wx:key="index" style="font-size:30px">
  <view>{{index + 1}}:</view>
  <view>姓名:{{item.name}}</view>
  <view>性别:{{item.sex}}</view>
  <view>年龄:{{item.age}}</view>
  <view>功夫:{{item.kongfu}}</view>
  <text>\n\n</text>
</view>

注:这里特意把字体设置的较大,以便3条记录就超过一屏(否则无法触发 onReachBottom 事件)。

修改页面的 index.js 文件内容如下:

......
  data: {
    dataObj: [] // 设置为数组,方便追加
  },
  
  getLimitedData(limitNum, skipNum) {
    wx.showLoading({
      title: '加载中……',
      mask: true
    })
    wx.cloud.callFunction({
      name: 'getLimitedData',
      data: {
        limitNum: limitNum,
        skipNum: skipNum
      }
    })
    .then(res => {
      var oldData = this.data.dataObj
      var newData = oldData.concat(res.result.data)

      console.log(res.result.data)
      this.setData({
        dataObj: newData
      })

      wx.hideLoading()
    })
  },

  onLoad: function (options) {
    this.getLimitedData(3, 0)
  },

  onReachBottom: function () {
    var skipNum = this.data.dataObj.length
    this.getLimitedData(3, skipNum)
  },

测试效果如下,当页面加载后,初始时会显示3条记录:

在这里插入图片描述

当页面滚动到底部时,就会触发获取更多记录:

在这里插入图片描述

当页面再次滚动到底部时,就又会触发获取更多记录,以此类推。

参考

  • https://www.bilibili.com/video/BV1MY411Y7Ak/?p=17&vd_source=2ec1bf89a54b0d3afd52d89760b0dd55
  • https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions.html

http://www.niftyadmin.cn/n/320314.html

相关文章

kali整体版本更新方法,为啥更新?

玩过kali都知道&#xff0c;如果不更新版本&#xff0c;那么安装某个软件总是有很多依赖版本问题&#xff0c;解决起来的确麻烦&#xff0c;这篇文章彻底解决这些问题。 1&#xff0c;更新源 国外源与国内源的选择 kali默认配置的是国外源&#xff0c;但国外源的下载速度非常慢…

[免疫学]抗原递呈详解

目录 &#x1f9eb;1. 抗原递呈是什么 &#x1f9eb;1.1 MHCⅠ类分子 &#x1f9eb;1.2 MHCⅡ类分子 &#x1f9eb;1.3 MHCⅠ类分子 分子介导的抗原递呈 &#x1f9eb;1.4 MHCⅡ类分子 分子介导的抗原递呈 &#x1f9eb;1.5 抗原递呈细胞 &#x1f9eb;1.5.1 激活的树突状…

【k8s】Kubernetes 组件概述

控制平面 &#xff1a; 管理集群中的工作节点和 Pod 节点 &#xff1a; 一组工作机器&#xff0c;称为节点&#xff0c;每个集群至少有一个节点 pod &#xff1a;节点会托管pod &#xff0c;pod是所有业务类型的基础&#xff0c;也是K8S管理的最小单位级&#xff0c;它是一个或…

Shell 编程之awk

目录 一、简介 二、正则表达式和文本三剑客 1、显示/etc/passwd文件中以nologin结尾的行&#xff1b; 2、找出"netstat -tan"命令的结果中&#xff0c;以LISTEN后跟0或多个空白字符结尾的行 3、在/etc/fstab文件中不以#开头的行的行首增加#号 4、删除/tc/fstab文…

linux内核编译不通过问题的两种排查方法(非正式)

目录 一、前言 二、 问题现象 三、问题排查思路1&#xff1a;问题所在处向上排查 3.1 整体思路 3.2 排查过程 3.3 资料查询 3.4 尝试动作1&#xff1a;开启相应配置项 3.4.1 检查内核配置项 3.4.2 开启配置项 3.4.3 尝试编译 四、问题排查思路2&#xff1a;从上向下排…

特殊类设计

特殊类设计 简单的特殊类设计 设计一个不能拷贝的类 这个还是挺简单的&#xff0c;在C98和C11中有两种不同的设计方法&#xff0c;在C98中可以将构造函数封装成私有成员&#xff0c;在C11中可以在构造函数后面加 delete&#xff0c;让编译器删除该默认成员函数 代码也很简单&…

C语言从入门到精通第18天(指针和函数的联用)

指针和函数的联用 一级指针作为函数的形参二级指针 一级指针作为函数的形参 当函数的形参为数组时&#xff0c;我们定义函数如下&#xff1a; 语法: 数据类型 函数名(数据类型 数组名) 例如 : void func(int a[],int a){ 语句; } 但是在实际使用中我们通常用指针的形式进行…

(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例

文章目录 一&#xff1a;频域高通滤波&#xff08;1&#xff09;理想的高通滤波器&#xff08;2&#xff09;巴特沃斯高通滤波器&#xff08;3&#xff09;指数高通滤波器&#xff08;4&#xff09;梯形高通滤波器 二&#xff1a;综合案例——人像美化&#xff08;1&#xff09…