微信小程序云开发快速入门(4/4)

news2024/11/25 22:49:32

前言

上一章节《微信小程序云开发快速入门(3/4)》
我们在之前的分享中学习到了,云存储和云数据库,接下来我们来学习下云函数。

云函数

云函数相当于服务器接口的概念,它并属于小程序端代码。它是以函数的形式运行后端代码来响应事件以及调用其他服务。运行环境是Node.js。

由于我看大家的项目目录结构没有统一,所以先统一下项目目录结构。
一共分成三部分:

  1. cloudfuntions文件夹云函数根目录
  2. miniprogram文件夹则放置的是小程序的页面文件
  3. project.config.json 配置文件
    在 project.config.json 中进行配置:
{    
  "miniprogramRoot":  "miniprogram/",
  "cloudfunctionRoot": "cloudfunctions/",
  // ... 
}

目录结构同意后,我们先来体验下云函数魅力

新建云函数


新建一个 sum 云函数

在新建的同时云函数自动会部署到云开发控制面板中的云函数列表里面去

然后我们来实现下这个sum云函数

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

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const sum = event.a + event.b
  return sum
}

通过小程序端传入两个参数分别是 a 和 b,然后云函数对这两个参数进行求和返回到小程序端。编写完毕后右键上传。

上传成功后,小程序开发工具会有提示,在云开发控制后台云函数列表更新时间也会发生变化。

调用云函数

通过 callFunction 来调用云函数

wx.cloud.callFunction({
        // 要调用的云函数名称
        name: 'sum',
        // 传递给云函数的event参数
        data: {
          a: 1,
          b: 2,
        }
      }).then(res => {
        console.log(res.result)
        // output: res.result === 3
      }).catch(err => {
        // handle error
      })

云函数调试

上传云函数需要等待时间以及通常在实际开发中有可能你当前写的云函数需要操作多个步骤才能触发到,这个时候我们最好是先在本地测试一下云函数是否正确,然后再部署上传到云端。那如何本地测试呢?右键点击需要测试的云函数目录,选择本地调试。

先会提示你初始化 node 相关环境

安装完成后,则可以看到云函数界面

可以根据情况来选择手动触发和模拟器触发,我们选择手动触发。

选择完手动触发后,然后输入测试的参数,点击调用

{
  "a": 1,
  "b": 2
}

调用成功后会显示:

除此之外,还可以在在云开发控制面板进行线上云函数测试。

使用云端测试由于有个网络请求的过程,所以需要等待一下。

云函数日志

每次云函数调用记录都可以在云函数日志中找到,并且可以查看到在云函数打印的console.log。

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

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const sum = event.a + event.b
  console.log("sum",sum)
  return sum
}


支持通过函数名或者Request ID 和请求状态、时间区间来进行对日志的更精准的定位查找。云函数调试的时候,不能只依赖小程序端的的return返回的报错,因为它只是反馈云函数的调用结果以及调用是否出现错误error,更多的还是要在云函数里使用console.log打印云函数在执行过程中的一些日志情况。

操作数据库

之前都是利用的小程序端直接操作的数据库,云函数也可以操作。接下来我们来看下用云函数如何写操作数据库。新建一个云函数,命名为 memo。

首先我们先写的路由,通过传入的不同的action参数调用不同的方法。

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

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
    
  if (event.action && memoHelper[event.action]) {
    const result = await memoHelper[event.action](wxContext, event)
    return result
  }

  return {
    message: 'This action was not found',
    error: -1,
  }
}
//数据库
const db = cloud.database()
const memoHelper = {
  //查询所有记录
  async quearyAllMemo(context, params) {
    let res = await db.collection('memos').orderBy('updateTime', 'desc').where({
      openid: context.OPENID
    }).get()
    return res
  },
  //添加记录
  async addMemo(context, params) {
    params.data.openid = context.OPENID
    let res = await db.collection('memos').add({
      data: params.data
    })
    return res
  },
  //删除
  async deleteMemo(context, params) {
    console.log("deletememo", params)
    let res = await db.collection('memos').doc(params._id).remove()
    return res
  },
  //修改
  async updateMemo(context, params) {
    params.data.updateTime = new Date()
    let res = await db.collection('memos').doc(params._id).update({
      data: params.data
    })
    return res
  },
}

但是这里需要注意,在小程序端添加数据自动会加上当前操作人的openid,而云函数不会,但是为了识别这条数据的来源用户,所以需要自己手动添加上。

获取openid需要通过 getWXContext 在云函数中获取微信调用上下文,除此之外还可以获取以下这些参数:

调用云函数操作数据库,以添加为例:

wx.cloud.callFunction({
      name: 'memo',
      data: {
        action: 'addMemo',
        data: params
      }
    });

那么这个时候你心里肯定会有一个疑问,既然都可以调用,那么两端有什么区别呢?

两端的区别

云开发有运行在小程序端的SDK,以及运行在云函数端的SDK,它们都可以对云数据库进行增删改查、对云存储进行文件的上传、下载、删除等,也都可以调用云函数,以及对第三方API发起请求。一个简单的项目甚至我们只需使用到小程序端的SDK就够了,比如我们的备忘录小程序。

小程序端SDK与云函数端SDK虽然有很多相似之处,不过有不少不同的地方,具体表现如下:

权限体系

小程序端自带微信用户鉴权和安全规则,用户可以免鉴权登录小程序,在对数据库、云存储操作时受简易权限或安全规则的控制,比如权限设置为仅创建者可读写时,用户A就无法看到或修改用户B创建的数据,保证了小程序端SDK操作云存储、云数据库和云函数等资源时的安全性;而云函数端SDK则拥有云开发资源的最高权限(管理员权限),不受简易权限或安全规则的影响,用户A调用云函数时也能增删改查用户B创建的数据(可以使用云函数的逻辑来限制)。

值得一提的是,只有小程序端SDK调用云函数才能获取用户的登录态,管理端(控制台、云函数)调用云函数是获取不到用户的openid的(如果有需要,可以使用数据库等方式将openid作为参数传入)。

数据库操作

在小程序端直接使用SDK增删改查数据库,相比先调用云函数,再通过云函数来操作数据库来说,前者无论是在速度上(直接对数据库进行crud速度大概快100ms左右),还是在云函数的资源消耗上(后者会消耗云函数的资源使用量GBs、外网出流量)都更优。一般情况下,更加建议使用这种方案。

不过通过云函数来操作数据库相比小程序直接操作数据库来说,一是更加安全(小程序端代码容易被逆向),二是处理更灵活(比如小程序的修改都需要发布并通过审核而云函数端不会),三是更容易跨端(多个小程序可以共用一个云开发环境里的一套云函数代码)。

通常情况下来说,能用小程序端SDK处理的就尽量使用小程序端SDK,将数据的处理放在小程序端可以有效的减轻云函数的压力,提升处理速度,也降低使用成本。

API的支持

比如实时数据推送watch方法只支持小程序端SDK,而聚合查询里的联表查询lookup就只能在云函数端进行;如果数据库使用的是简易权限控制,小程序端就无法对数据库进行批量更新或删除(where.update、where.remove)。还有查询数据上,小程序端最多查询20条,云函数可以最多可以支持查询1000条。

网络请求

在小程序端使用wx.request()发起的网络请求只支持https,不支持http和ip,且域名需要备案,而在云函数端,我们可以使用axios、got等第三方模块发起网络请求,它不仅支持https、http、ip等,而且域名也不需要备案。此外,云函数也可以有固定的ip,尤其是数据库、公众号开发等对ip白名单有一定要求的情况。

云调用

云调用是云开发提供的基于云函数使用小程序、腾讯云开放接口的能力,比如订阅消息、云支付、图像处理等,尽管云调用也有https调用,不过云函数更加安全方便。

定时触发器

小程序端SDK的调用只有在用户打开和使用小程序的情况下才能执行,而云函数可以脱离小程序,在定时触发器的作用下定时/定期的执行一些任务。

后端服务

云函数不仅可以在wx-server-sdk模块的支持下使用云函数端SDK调用云开发环境里的资源,还可以安装一些Node.js的模块,来为小程序提供一些后端服务,比如收发邮件、短信、通知消息,进行图像、音视频等的处理等等

总结

云开发快速入门所有的一些基础常用操作在这一章节就结束了,大家要学会持续优化,优化是一个持续的过程,我们要利用已学习的知识不断做局部优化,而不是整个项目的重构。

学习更多微信小程序云开发快速入门知识请关注CRMEB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/848180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手班主任如何快速完成分班查询系统制作?

作为一个新手班主任,要快速完成分班查询系统的创建工作,可以按照以下步骤进行: 1. 确定需求:首先要明确分班查询系统所需的功能和要求。与学校领导和其他老师进行沟通,了解他们对系统的期望和需求,包括查询…

了解以太网通信中的九阳神功 - SOME/IP协议

智能座舱SOME/IP通信 概述SOME/IP基础协议SOME/IP SD协议通信行为流程开机流程关机行为行为时序总结概述 SOME/IP协议是目前国内座舱SOA化应用比较广泛的一种ECU或车辆网络内设备之间交换数据的网络通信协议。它允许不同车辆组件,如发动机控制单元、信息娱乐系统、车身控制模…

数学类问题(Leetcode)

1.质数数量 nullhttps://leetcode.cn/problems/count-primes/description/解题思路&#xff1a; 遍历大于1 且小于n的每个数的倍数&#xff0c;设置为非质数&#xff0c;剩下的就都是质数了。 代码&#xff1a; class Solution { public:int countPrimes(int n) {if(n<2)…

第一章-JavaScript基础进阶part5:移动端网页特效

文章目录 一、触屏事件-touch1.1 常见touch事件1.2 触屏事件对象&#xff08;TouchEvent&#xff09;1.3 移动端拖动元素 二、移动端常见特效2.1 click延时解决方案 三、移动端常用开发插件3.1 fastclick.js 解决移动端点击事件300ms延迟问题3.2 Swiper插件的使用 一、触屏事件…

网络防御(2)

1. 什么是防火墙&#xff1f; 2. 状态防火墙工作原理&#xff1f; 3. 防火墙如何处理双通道协议&#xff1f; 一、什么是防火墙&#xff1f; 防火墙是一种网络安全设备或软件&#xff0c;用于保护计算机网络免受未经授权的访问&#xff0c;并管理网络流量。它作为一个安全边界…

golang trace view 视图详解

大家好&#xff0c;我是蓝胖子&#xff0c;在golang中可以使用go pprof的工具对golang程序进行性能分析&#xff0c;其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助&#xff0c;鉴于当前对trace view视图的介绍还是很少&#xff0c;在粗略的看过tra…

双向带头循环链表+OJ题讲解

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

前端渲染数据

在前端对接受后端数据处理后返回的接收值的时候&#xff0c;为了解决数据过于庞大&#xff0c;而对数据进行简化处理例如性别&#xff0c;经常会使用1&#xff0c; 0这俩个来代替文字的男&#xff0c;女。以下就是前端渲染的具体实现。 以下是部分代码 <el-table-columnpr…

维深(Wellsenn):2023中国消费端VR内容开发商调研报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 国内互联网大厂商入局VR&#xff0c;字节跳动、网易表态明确。字节跳动2021年收购国内头部VR硬件厂商PICO后&#xff0c;加速构建VR内容生态&#xff0c;2021年 成立海南创见未来当前已推出VR视频应用…

fabric.js里toDataURL后,画布内容展示不全?

复现场景&#xff1a; 用fabric生成画布后&#xff0c;转成图片&#xff0c;然后直接在浏览器里打开&#xff0c;画布展示内容缺失 画布原图&#xff1a; toDataURL后链接在浏览器打开&#xff1a; 原因解析&#xff1a; base64链接太长&#xff0c;输入浏览器链接被截断&…

HOT79-跳跃游戏 II

leetcode原题链接&#xff1a;跳跃游戏 II 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j &…

VUE+view table.exportCsv()导出.csv文档时如何防止数据格式为科学计数

当使用table.exportCsv()方法导出数据时&#xff0c;出现科学计数法问题&#xff0c;像电话号码&#xff0c;身份证号码等&#xff0c;当数据大于15位后面的会用0替代。 针对这一问题&#xff0c;解决方法如下&#xff1a;就是再数字前加上制表符“\t”注意双引号&#xff0c;…

设计模式-简单工厂模式(静态工厂模式)java实现

介绍 简单工厂模式根据所提供的参数数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。 意图 提供一个类&#xff0c;负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator…

机械工业信息研究院:2023年中国生物制药行业报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 医药工业宏观情况分析 2021 年生物制药带动医药工业经 济指标大幅增长。根据统计&#xff0c;2021年规 模以上医药工业增加值同比增长 23.1%&#xff0c;增速较上年同期提升 17.2个百分点&#xff0…

MVSnet点云定量评估指标总结

根据MVSnet论文[1]原文说明&#xff0c;点云评估主要从准确性和完整性两个方面来评估。 针对准确性的评估&#xff0c;采用平均距离指标来度量&#xff0c;具体指标分别为Acc、Comp、overall&#xff0c;准确性指标越低越好&#xff0c;表示R与G之间的距离越小&#xff0c;恢复…

《CodeGeeX2 一个让你编码效率翻倍的扩展,分享几个使用小技巧》学习笔记

《CodeGeeX2 一个让你编码效率翻倍的扩展&#xff0c;分享几个使用小技巧》学习笔记 【Only Key Control】使用按键触发提示 使用注释来提升CodeGeeX生成代码的准确性 在函数的顶部添加对函数的说明然后输入function的关键字再使用【Alt /】来触发自动补全 使用CodeGeeX解释…

构建Docker容器监控系统(Cadvisor +Prometheus+Grafana)

Cadvisor PrometheusGrafana 1.1、Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 1.2、安装docker-ce [rootloc…

LeetCode 热题 100 JavaScript--98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 *** Definition for …

根据渲染数据长度动态渲染后缀图标

在动态获取数据时&#xff0c;想要渲染后面的图标是根据数据的长度渲染图标位置&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <el-row :gutter"60"><el-col :span"24"><el-form-item><el-input v-model.trim"form…

zuul实现黑名单,request多次读取问题,stream close

一&#xff0c;背景及设计 1.需要在网关实现黑名单功能&#xff0c;实现拦截指定接口。黑名单用户&#xff0c;会加入指定黑名单列表&#xff0c;关联对应功能&#xff0c;如用户登录&#xff0c;用户下单&#xff0c;用户接单。 2.表设计 平台表&#xff1a;不同系统 黑名单…