最近收到一个需求是:小程序获取关联公众号的文章并且显示。
首先想到的是,需要客户去买服务器和域名,进行域名备案,然后为客户开发一个网站,能够通过公众平台的appid与key来获取公众号的素材列表,最后开发一个接口给小程序使用。一般客户购买服务器和域名就是个难题,劝退了很多人。
但是我查看了微信小程序的官方文档,发现有一个云开发功能,其中有云数据库、云存储、云函数三种功能。类似于Serverless,我们不需要去买服务器和域名了,直接使用小程序的云开发功能就能做很多事情。我就想试试能不能用云开发功能做获取公众号文章的事情。
云数据库是一个类似于Redis的Key-Value数据库,使用微信提供的一些查询API,能够进行链式操作,有点像.Net的Entity Framework。
云存储主要是用来做上传与下载文件使用,可以用来做相册等应用。
云函数是提供了一个Node.Js的运行环境,我们能够部署自己的代码,也能够使用npm配置引入其他的开源软件包。云函数只能通过微信小程序框架里特有的方式调用,并且返回结果。与我们购买服务器自建服务不同的是,我们不清楚到底有几个实例在运行,每次执行不一定在同一个实例中,所以我们不太适合做一些在内存中缓存数据、保持状态的工作,应当及时把数据存入云数据库。云开发的云函数的独特优势在于与微信登录鉴权的无缝整合。当小程序端调用云函数时,云函数的传入参数中会被注入小程序端用户的 openid,开发者可以直接使用该 openid。
在做这个功能之前,首先是新建小程序,将公众平台与小程序关联,公众平台个人订阅号也是可以的。
然后在小程序的项目中,project.config.json文件中加入一个配置项,指定云函数的存储目录。
"cloudfunctionRoot": "clouds/"
新建这个clouds目录,在其中建立一个文件夹,比如我们命名为fetch,以后调用云函数也用这个名称,然后在其中新建index.js,作为云函数的入口。一个云函数的基本结构是:
// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');
cloud.init();
// 云函数入口函数
exports.main = async (event, context) => {
return {200: 40400, msg: 'success'};
}
我们可以像MVC和Servlet等Web框架一样,要求客户端传一个action参数,然后根据不同的action参数,选择对应的处理函数,也可以创建多个云函数。代码类似于:
var action = event.action;
if(!action){
return {code: 20000,