小程序云开发攻略,解决最棘手的问题

背景

最近小程序非常的火,应公司业务发展要求,开发维护了几款小程序,公司开发的小程序都是由后端提供的接口,开发繁琐而复杂,直到小程序出现了云开发,仔细研读了文档之后,欣喜不已,于是我着手开发了本人的第一款小程序

分析

云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。

优势

  • 无需自建服务器,数据库,无需自建存储和CDN
  • 数据库模型很简单,就是一个json形式的对象格式
  • 调用服务端云函数自动获取openid,再也没有繁琐的授权登陆流程了,只要进入小程序就是登陆状态,体验真的好
  • 开发迅速,只需要前端就能搞定所有开发工作

需要解决的问题

数据库切换问题

使用过云开发的人都发现云开发切换数据库环境是最头疼的,如果手动去切换容易搞错,不小心在当前环境修改了线上数据库数据

直到官方出了这个函数问题也就迎刃而解

cloud.updateConfig({
    env: ENV === 'local' ? 'dev-aqijb' : ENV
  });

我使用的是服务端云开发功能,为什么要这样判断,因为在开发工具中ENV = ‘local‘,所以这么判断一下,保证开发工具中使用的是测试环境数据库

使用taro多端开发框架,借助于webpack,还可以通过process.env.NODE_ENV值区分当前代码开发环境

await Taro.cloud.init({
        env: `${process.env.NODE_ENV === 'development' ? 'dev-aqijb' : 'pro-hljv7'}`
        /* env: 'pro-hljv7' */
      });

这样可以保证开发环境和线上环境可以使用对应环境的数据库

数据库字段定义问题

因为JS是弱类型语言,不能像typescript那样静态定义变量类型,这样添加到数据库的字段数量和字段类型都无法控制

我不想用typescript,能不能实现这样的功能呢,可以用superstruct库来实现这个功能

详细使用案例见下方代码

函数文件太多的问题

官方和他人教程的例子都是一个文件对应一个云函数,通过开发体验我发现这样做并不好,当项目有多个表的时候,找个函数文件真的太难了
我们可以将一个表的增删改查函数全部写入一个文件中

教程: 首先每个云函数文件中package.json引入superstruct

{
  "dependencies": {
    "wx-server-sdk": "latest",
    "superstruct": "latest"
  }
}

以下代码是一个完整的云函数例子

const cloud = require('wx-server-sdk');
const { struct, superstruct } = require('superstruct');
cloud.init();
//小区信息
const Model = () => {
  const db = cloud.database();
  const _ = db.command;
  const collection = db.collection('address');
  return {
    async add(data) {
      try {
        data = struct({
          name: 'string', //名字
          phone: 'string',
          unit: 'number', //楼单元号
          doorNumber: 'string', //门号
          communityId: 'string', //小区id
          _openid: 'string' //用户的id
          //isDefault: 'boolean' //是否默认地址
        })(data);
      } catch (e) {
        const { path, value, type } = e;
        const key = path[0];

        if (value === undefined) {
          const error = new Error(`${key}_required`);
          error.attribute = key;
          throw error;
        }

        if (type === undefined) {
          const error = new Error(`attribute_${key}_unknown`);
          error.attribute = key;
          throw error;
        }
        const error = new Error(`${key}_invalid`);
        error.attribute = key;
        error.value = value;
        throw error;
      }
      let res = await this.getList({ _openid: data._openid });
      if (res.data.length >= 1) {
        return { msg: '当前只支持保存一个地址' };
      }
      res = await collection.add({
        data,
        createTime: db.serverDate(),
        updateTime: db.serverDate()
      });
      return res;
    },
    async getAdressById({ _openid, _id }) {
      const user = await collection
        .where({
          _openid,
          _id: _.eq(_id)
        })
        .get();
      return user;
    },
    //更新指定的id 先判断手机号修改没,没修改直接就改数据,修改过判断一下库中有没有这条数据
    async update(data) {
      //更新表的操作
    },
    //删除指定id的shop
    async remove({ _id, _openid }) {
      //删除表的操作
    },
    /**
     * 获取商列表
     * @param {*} option {category 类别, pagenum 页码}
     */
    async getList({ _openid }) {
      const shopList = await collection
        .where({
          _openid
        })
        .get();

      return shopList;
    }
  };
};

exports.main = async (event, context) => {
  const { func, data } = event;
  const { ENV, OPENID } = cloud.getWXContext();
  // 更新默认配置,将默认访问环境设为当前云函数所在环境
  console.log('ENV', ENV);
  cloud.updateConfig({
    env: ENV === 'local' ? 'dev-aqijb' : ENV
  });
  let res = await Model()[func]({ ...data, _openid: OPENID });
  return {
    ENV,
    data: res
  };
};

函数使用方式

wx.cloud.callFunction({
      'address', //云函数文件名
      data: {
        func: 'add', //云函数中定义的方法
        data: {} //需要上传的数据
      }
    });

图片 视频等文件

直接打开云开发控制台选择存储直接上传文件,复制url地址就可以放到代码中使用了

扫码体验我的小程序:

原文地址:https://www.cnblogs.com/chengfeng6/p/11611549.html

时间: 2024-11-06 20:01:10

小程序云开发攻略,解决最棘手的问题的相关文章

小程序云开发调用HTTP请求中got第三方库使用失败解决方法

小程序云开发调用HTTP请求中got第三方库使用失败解决方法 错误代码 {"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"The \"original\" argument must be of type function"} 替换方案 // 云函数入口文件 const cloud = req

微信小程序云开发入门到发布上线

初始化项目 起步说明[非小白教程] 适合人群[建议快速看文档,对着写一遍] 看过官方文档,并简单的写过 起步教程 云开发文档 熟悉vue/es6 小程序注册[微信公众平台] 获取appid[微信公众平台-开发-开发设置] 新建小程序云开发项目 新建项目选择一个空目录,填入 AppID(使用云开发能力必须填写 AppID) 勾选创建 "小程序云开发 " 点击新建即可得到一个展示云开发基础能力的示例小程序. 该小程序与普通 QuickStart 小程序有以下不同需注意: 无游客模式.也不可

微信小程序云开发报错解决: Setting data field "openid" to undefined is invalid.

最近在学习微信小程序云开发,刚一开始就遇到了问题. 点击获取openid的时候控制台开始报错: [云函数] [login] user openid:  undefined VM97:1 Setting data field "openid" to undefined is invalid. 然后我开始去百度搜索解决这个问题,各种方法都试过了,还是没有解决.换了一个思路,开始追踪代码: 鼠标悬停到右边的 index.js:55,发现是/pages/index/index.js文件的第55

用小程序·云开发两天搭建mini论坛丨实战

笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数.数据库.存储三大能力.关于云开发,可参考文档:小程序·云开发. 个人感觉云开发带来的最大好处是鉴权流程的简化和对后端的弱化,所以像笔者这种从未接触过小程序开发的人也能够在周末两天时间内开发出一个功能完备.体验闭环的勉强能用的产品. 最后,本文并不是搬运官方文档,也不会详细介绍开发工具和云开发后台的使用,所以建议结合上面给出文档链接一起消化本文. 功能分析 该小程序功能目前较为简单

小程序·云开发的HTTP API调用丨实战

小程序云开发之httpApi调用. 小程序云开发之httpApi调用(返回"47001处理") 技术栈 采用 nodejs + express 搭建web服务器,采用 axios 请求第三方 httpApi nodejs express axios 项目结构 通过应用生成器工具 express-generator 可以快速创建一个应用的骨架. 主要的核心文件 routes/base.js(api设置),util/rq.js(axios封装),views/base.pug(接口文档) |

小程序云开发小记

小程序云开发小记 现在云开发是越来越火了,刚好最近在做一个小程序云开发的项目,就记录一下心得和遇到的问题! ?? 小程序云开发与普通的开发有什么区别? 最大的区别就是把数据库搬到了云上,而且可以让前端直接操作数据库,让前端开发者某种意义上成为了全栈工程师! ?? 云开发新增了两个关键的知识点:云函数 和 云数据库操作. 云函数 云函数, 顾名思义:就是放到云服务器上的函数,然后小程序可以通过wx.cloud.callFunction的方法调用,非小程序端,也可以通过http请求调用云函数. 云函

【微信小程序云开发】从陌生到熟悉

前言 微信小程序在9月10号正式上线了云开发的功能,弱化后端和运维概念,以前开发一个小程序需要申请一个小程序,准备一个https的域名,开发需要一个前端一个服务端,有了云开发只有申请一个小程序,一个前端就能搞定,真的是零成本. 云开发三大基础能力 云函数:运行在微信服务器上的函数,处理微信相关操作有天然优势,如获得用户信息异常方便(以前服务端解析很麻烦) 数据库:一个小程序可以直接操作的JSON数据库,可以直接操作数据库,不在需要服务端了. 存储:用来存储文件和图片 阅读本文之前最好对微信小程序

微信小程序云开发更换云开发环境

小程序云开发环境初始化默认是第一个环境,但是我们可以指定环境id //app.js App({ onLaunch: function () { if (!wx.cloud) { console.error('请使用 2.2.3 或以上的基础库以使用云能力') } else { wx.cloud.init({ env: "kindear-fd77cd", traceUser: true, }) } this.globalData = {} } }) 就可以成功更换云开发环境. 原文地址:

小程序云开发向数据库中新增数据

小程序云开发向数据库中新增数据,基本操作在新建完一个云项目后都有了,右键上传部署login云函数后,就可以在模拟器中简单地操作数据库了 这是databaseGuide.js生成时就给出的代码,增删改查都需要先将相关部分的代码去掉注释. // pages/databaseGuide/databaseGuide.js const app = getApp() Page({ data: { step: 1, counterId: '', openid: '', count: null, queryRe