欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由达文西发表

笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数、数据库、存储三大能力。关于云开发,可参考文档:

该小程序功能目前较为简单(发布帖子、浏览帖子、发布评论),可用下图表示,无需赘述:

img

由架构图可知,云开发的数据库(存帖子、存评论)、存储(图片)、云函数(读、写、更新数据库等)都将涉及,很好地达到了练手的目的

发布帖子

如果帖子不带图片,直接写数据库即可,如果带图片则需要先存入图片到云开发提供的存储中,拿到返回的fileId(可理解为图片的url)再一并写入数据库,核心代码:

    for (let i = 0; i < img_url.length; i++) {       var str = img_url[i];       var obj = str.lastIndexOf("/");       var fileName = str.substr(obj + 1)       console.log(fileName)       wx.cloud.uploadFile({         cloudPath: 'post_images/' + fileName,//必须指定文件名,否则返回的文件id不对         filePath: img_url[i], // 小程序临时文件路径         success: res => {           // get resource ID:            console.log(res)           //把上传成功的图片的地址放入数组中           img_url_ok.push(res.fileID)           //如果全部传完,则可以将图片路径保存到数据库           if (img_url_ok.length == img_url.length) {             console.log(img_url_ok)             that.publish(img_url_ok)           }         },         fail: err => {           // handle error           console.log('fail: ' + err.errMsg)         }       })     }  

通过img_url_ok.length == img_url.length我们确定所有图片已经上传完成并返回了对应的id,然后执行写入数据库的操作:

  /**    * 执行发布时图片已经上传完成,写入数据库的是图片的fileId    */   publish: function(img_url_ok) {     wx.cloud.init()     wx.cloud.callFunction({       name: 'publish_post',       data: {         openid: app.globalData.openId,// 这个云端其实能直接拿到         author_name: app.globalData.userInfo.nickName,         content: this.data.content,         image_url: img_url_ok,         publish_time: "",         update_time: ""//目前让服务器自己生成这两个时间       },       success: function (res) {         // 强制刷新,这个传参很粗暴         var pages = getCurrentPages();             //  获取页面栈         var prevPage = pages[pages.length - 2];    // 上一个页面         prevPage.setData({           update: true         })         wx.hideLoading()         wx.navigateBack({           delta: 1         })       },       fail: console.error     })   },

通过wx.cloud.callFunction我们调用了一个云函数(通过name指定函数名),并将帖子内容content和图片image_url以及其他信息(发布者昵称、id等)一并传到云端。然后再看看这个云函数:

exports.main = async (event, context) => {   try {     return await db.collection('post_collection').add({       // data 字段表示需新增的 JSON 数据       data: {         // 发布时小程序传入         //author_id: event.openid,不要自己传,用sdk自带的         author_id: event.userInfo.openId,         author_name: event.author_name,         content: event.content,         image_url: event.image_url,         // 服务器时间和本地时间会造成什么影响,需要评估         publish_time: