1.前言
经前面几篇文章的介绍,已经给大家介绍了云开发中的云数据库与云存储,那么了解完了云数据库云存储之后,接下来我介绍一下云开发中的另外一个重要的功能,云函数。
2.什么是云函数
要介绍清楚这个云函数之前,首先得要先来看看过去我们用服务器来存储数据与文件的时候,我们是怎么做的,我们来看一下下面这张图。
可以看到根据图中信息,可以知道,首先我们有着自己的一台服务器,然后在自己的服务器上,安装了对应的数据库这类似的东西,数据库里面存储的就是结构化数据。
那么除此之外这个服务器上,是不是还可以存储一些文件数据,所以在图中可以看到这两块,一块是数据库,一块是文件数据,这两块都是存储在服务器上的,这个是 过去
我们使用自己服务器的时候。
好,直到如今,我是不是介绍了云开发,在云开发当中,他是不是给我们提供了云数据库与云存储这两个功能,随着而来我们的演示图也就变成了下面这样。
这样一来是不是将我们自己服务器上面的功能给替换掉了,替换掉了之后还没完,无论是云数据库还是云存储,都是用来存储数据的,处理不了数据,就比如说我存储了一些结构化的数据,我现在需要对这些结构化的数据进行加工处理,这个时候我们该怎么办?
这个时候我们的客户端是不是得要发送一个请求到服务器上(云),把我们需要处理的数据拿回来,拿回来之后就是在本地对数据进行加工处理,那本地加工,本地是什么呢?本地就是我们的一个手机,这个时候问题又来了,手机的性能有电脑的性能好吗?是不是肯定没有,那么没有的话,过去我们想对这些数据进行处理加工,我们是怎么做的呢?
是不是在服务器上,我们可以写一些代码,然后在服务器上运行,然后我们的客户端发送请求到服务器上,服务器就会对我们的数据进行加工处理,然后将加工处理之后的数据返回给我们的客户端,这样一来,我们的客户端就不需要做太多的事情了,我们的客户端只需要发送请求,然后接收数据就可以了。
现在的这个演示图就可以演变成下面这样:
这样演变一来,我们的数据就是在服务器上处理也就是电脑上面处理,这个时候我们的性能是不是就好了,但是现在我们如果用云开发之后,这个云开发提供的云数据库和云存储是不是不能处理数据。
我们是不是只能在本地处理,也就是在手机上处理,这个时候性能是不是就差了,所以说为了解决这个问题,给我们搞了一个云函数出来,那么云函数是什么呢?
云函数是不是就是给云增加了编码的能力,增加了处理数据的能力,这个就是云函数,这个就是云函数的作用。最终的演示图就变成了下面这样:
这个时候云开发中的能力与我们自己搭建的服务器的能力就一样了。
3.云函数的创建
那么怎么创建云函数呢,也非常的简单,前面我说过,如果是云开发的小程序,项目当中有两个目录,一个是 miniprogram
目录这个是编写我们小程序代码的,还有一个是 cloudfunctions
目录,这个目录是用来存放我们的云函数的,所以在这个目录下编写对应的云函数即可。
那么我们现在就来创建一个云函数,我们在 cloudfunctions
目录下创建一个目录,这个目录就是我们的云函数的名字,鼠标右键点击 cloudfunctions
目录,然后选择 新建 Node.js 云函数
,然后输入我们的云函数的名字:
这里目前只有
Node.js
云函数,后续会有其他的语言的云函数,这个就不知道了。如果有你就可以选择其他的语言,按照自己的喜好来选择。
这里我是做测试我就起了一个 test:
通过观察这个云函数中有三个文件:
index.js
:这个是我们的云函数的入口文件,我们的云函数的代码就写在这个文件当中。
package.json
:依赖文件(NodeJs,可以依赖一些其他的库)
config.json
:配置文件
3.1.云函数的入口文件
我们现在来看一下这个 index.js
文件,这个文件就是我们的云函数的入口文件,我们的云函数的代码就写在这个文件当中。
官方示例代码:
代码语言:javascript复制// 云函数入口文件
const cloud = require('wx-server-sdk')
// 使用当前云环境
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
在这个代码中首先引入了 wx-server-sdk
这个库,这个库是不是就是用来操作云开发的,然后是指定当前使用的云环境,然后在这个文件中导出了一个 main
函数,这个函数就是我们的云函数的入口函数,这个函数中有两个参数,一个是 event
,一个是 context
,这两个参数是什么呢?
event
:这个参数是我们的客户端调用云函数的时候传递的参数,这个参数是一个对象,这个对象中包含了客户端传递过来的参数。context
:这个参数是一个对象,这个对象中包含了一些上下文的信息,比如说当前用户的openid
,当前用户的appid
,当前用户的unionid
,这些信息都是在这个context
对象中。
这两个参数后续在介绍,如上代码这是官方的示例,我们先给删掉,自己来编写一个:
代码语言:javascript复制// 云函数入口文件
const cloud = require('wx-server-sdk')
// 使用当前云环境
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
function example() {
return "我是 example 函数";
}
// 云函数入口函数
exports.main = async (event, context) => {
const res= example();
return res;
}
我定义了一个 example 的函数,然后在入口函数中进行调用了,假设我们调用这个函数,在函数中处理数据,那么调用者拿到的结果就是已经处理好的,这样是不是就没问题了,这个就是云函数的基本结构。
所以说你要做的事情就是,找到云函数的目录,在云函数目录下创建自己的云函数,在创建的云函数的 index.js 中来编写自己的业务逻辑代码即可,编写好之后怎么办,编写好之后就可以在 main 中进行调用你编写好的业务逻辑,拿到结果返回给调用者。
3.2.上传云函数
通过如上的这么一顿操作,我们的云函数就创建好了,那么我们怎么调用这个云函数呢?也就是想在小程序当中进行使用,可以直接使用吗?我的答案是不可以,为什么不可以呢?
云函数云函数是不是是在云端的,那么我们编写的这个函数是不是仅仅在本地,写好云函数之后我们需要将云函数上传到云上,然后才可以在小程序当中去云里面调用这个函数。
好,这里来简单的做一个云函数使用步骤梳理:
- 创建一个云函数
- 编写云函数的业务逻辑代码
- 上传云函数到云端
- 在小程序中调用云函数
现在我已经完成到了,第二步,接下来就是 上传云函数到云端
。
找到创建的云函数文件夹目录,鼠标右键,选择如上图所示,即可完成上传,因为我们是 NodeJS 代码,所以云当中也需要进行安装。
上传结果如下图,这个不代表已经彻底完成了:
弹出了如下图这个弹框才算是彻底完成:
4.云函数的使用
首先我们找到项目结构的编写小程序代码的目录,找到 miniprogram/pages/cloud-fn/index.wxml
, 添加一个调用云函数的按钮:
<button type="primary" bindtap="onTestTap">调用云函数</button>
然后在 index.js
中编写对应的事件处理函数:
Page({
async onTestTap() {
const res = await wx.cloud.callFunction({
name: 'test'
});
console.log(res)
}
})
在这个函数中,我们调用了 wx.cloud.callFunction
这个函数,这个函数是不是就是用来调用云函数的,这个函数中有一个参数,这个参数是一个对象,这个对象中有一个 name
属性,这个属性的值就是我们的云函数的名字,这个名字是不是就是我们在创建云函数的时候起的名字,打开云控制台,我们可以看到我们的云函数的名字:
运行小程序,点击按钮,可以看到控制台输出了如下的结果:
ok,完毕,如果你更改了云函数的内容,是需要重新上传的,重新上传之后,再次调用云函数,就可以看到最新的结果了。