近期,小程序开放了新的能力——「小程序·云开发」,帮助开发者快速构建微信小程序的后端服务。我作为一名微信小程序的开发者,也在第一时间尝试了小程序云开发,并将我自己在开发过程中的经验分享给大家。
小程序云开发是什么
简单的来说,小程序云开发是一款 Serverless 服务,他为开发者提供了「云函数」、「云数据库」和「云文件存储」,并且将这些能力封装成特定的接口,以 wx.cloud.xxx
来进行调用。
小程序云开发不是什么
首先,小程序云开发不是 PaaS ,它和我们所熟悉的 BAE、Google App Engine 不同,所提供的云函数并不是完整的环境,而是以一个特定的事件为单位的。严格来说,它所提供的云函数功能其实是 FaaS (Function as a Service),同类型的产品有 LeanCloud 的云函数、 Bmob 的云函数、AWS 的 Lambda、 Azure 的 Functions 和 Google Cloud Functions。
其次,小程序云开发不是 LeanCloud 、 Bmob 之类的 BaaS 。不同于上述的两款产品,他们提供了丰富的 API 接口,能够实现各种各样的功能,小程序·云开发将接口进行深度的封装,仅能在小程序、云函数中通过 wx.cloud 和 wx-server-sdk 来调用(截止2018年8月24日)。因此,小程序云开发 仅能应用在小程序中,无法在其他产品中应用(比如 App )
小程序云开发适合什么样的场景?
所有的业务逻辑都仅仅需要在小程序端完成,无需过于复杂的管理逻辑(这是因为云函数、云数据库无法在小程序以外的区域调用,因此无法实现强大的 Web 管理界面)
小程序云开发的优势
1. 微信登录逻辑简单
小程序云开发可以自动实现用户登录的校验,开发者无需再次校验用户身份,直接通过云函数的 event.userInfo.openId
即可获取到用户信息。直接调用数据库 、文件存储 API 时,也会自动关联到用户对应的 openId ,如果用户授权小程序获取昵称等信息,这些信息也会自动出现在小程序云开发的管理控制台中的用户登录部分。不需要开发者手动上传。
2. 免费
目前小程序云开发提供了免费 1GB 的数据库存储和 免费 5 GB 的文件存储,这个存储量并不是很大,但是对于一些个人开发者来说,还是绰绰有余的,开发者可以使用这些容量来快速开发自己的小程序。
3. 简单
小程序云开发的调用非常的简单,你只需要了解 JavaScript 和一些简单的异步的知识 (promise),就可以完成小程序云开发的内容。
小程序开发过程中遇到的一些坑
1. 小程序云开发新建一直表(集合)的时候 需要在表里配置读写权限,否则请求数据的时候可以查到这种表,但是没有数据。
2. 小程序云开发请求数据有条数限制,一次最多返回20条,请求如果放到云函数里,最多可以返回100条
const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() // 云函数入口函数 //分页查询云函数 exports.main = async(event, context) => { var dbName = event.dbName; //集合名称 var filter = event.filter ? event.filter : null; var pageIndex = event.pageIndex ? event.pageIndex : 1; var pageSize = event.pageSize ? event.pageSize : 10; const countResult = await db.collection(dbName).where(filter).count() //获取集合总记录 const total = countResult.total; //得到总记录数 const totalPage = Math.ceil(total / pageSize) //计算需要多少页 var hasMore; //提示前端是否还有数据 if (pageIndex > totalPage || pageIndex == totalPage) { //没有数据了 返回false hasMore = false } else { hasMore = true } //最后查询数据返给前端 return db.collection(dbName).where(filter).skip((pageIndex - 1) * pageSize).limit(pageSize).get().then(res => { res.hasMore = hasMore; return res }) }
let that = this wx.cloud.callFunction({ name: 'todoList',//云函数名称 data: { dbName: 'todoList',//所请求的库 pageIndex: that.data.pageIndex, //当前页数 pageSize: that.data.pageSize//一页返回的条数 }, success: function (res) { console.log(res.result, '[todoList][活动列表]') that.setData({ things: that.data.things.concat(res.result.data), hasMore: res.result.hasMore }) }, fail: res => { console.log(res) } })