云开发踩坑

主要重点介绍小程序云开发步骤、云数据库操作、云函数对接腾讯短信服务

一、云开发步骤

1. 新建云开发小程序
新建项目

appId需要是注册好的 不能使用测试号

2. 开通云开发后台
点击云开发
开通云开发后台
3.环境设置

新建云环境 小程序允许建两个环境,一般一个用于正式环境,一个用于测试。
如果新建了测试环境的话,一定要在小程序中声明测试环境的环境ID,否则小程序默认使用第一个环境。


新建环境
环境配置
4.环境选择
项目目录

现在回到项目目录,其中cloudfunctions为云函数的文件夹,miniprogram为小程序页面目录。



可以看到cloudfunctions显示未选择环境,右键此目录选择环境。


选择了之后可以看到会生成几个默认的云函数,一般login是比较常用的云函数。可以获取openId等数据。


app.js配置

在app.js中设置使用的环境ID。一定要声明环境 否则云函数返回的数据为null

5.新建云函数

右键cloudfunctions文件夹即可【新建Node.js云函数】,新建云函数会默认生成几个文件,我们只需要在index.js中写函数内容即可。


默认生成的index.js

如果需要操作数据库则需要声明


image.png
//云函数主体
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()  //获取小程序的信息,如OPENID等
  const _ = db.command;
  try {
    return await db.collection('address').add({
      data: {
        userid: wxContext.OPENID,   //用户唯一id从wxContext获取
        name: event.name,   //云函数入参从event传入
        phone: event.phone,
        province: event.province,
        city: event.city,
        district: event.district,
        detail: event.detail,
        isdefault: event.isdefault,
        createTime:db.serverDate()
      },
      success: function(res) { 
      }, fail: err => {
      }
    })
  } catch(e) {}
}
6.上传云函数

写完云函数后需要上传云函数才能在小程序中调用


上传云函数
7.调用云函数
 wx.cloud.callFunction({
      name: 'addcart',   //云函数名字
      data: {
        goodsid: goodsid,  //云函数入参
      },
      success(res) {
        console.log(res)
        Toast.clear();
      },
      fail(err) {
        Toast.clear();
        console.log(err);
        wx.showToast({
          icon: 'none',
          title: '出错啦!请稍后重试'
        })
      }
    })

二、云数据库操作

1.新建数据库
新建集合

云数据库采用的是NoSql,表即是集合


增加一列数据

会自动生成_id作为主键

2.增

不推荐直接在小程序中不通过云函数操作数据库,会有很多限制,(如:查询的条数,直接操作数据库最多只能20条),所以后续的数据库操作都是基于云函数中的。

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 添加商品到购物车
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
    try {
      return await db.collection('cart').add({    //会默认添加_id字段作为主键
        data: {
          userid: wxContext.OPENID,
          goodsid: event.goodsid,
          amount: 1,
          selected: true,
          createTime:db.serverDate()
        },
        success: function(res) {    
        }, fail: err => {
        }
      })
    } catch(e) {
      console.log(e);
    }
}
2.删
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async (event, context) => {
  try {
    return await db.collection('address').doc(event._id).remove({  //根据传入的主键删除
      success: function(res) {     
      }, fail: err => {
      }
    })
  } catch(e) {
    console.log(e);
  }
}
3.改
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 更新收货地址
exports.main = async (event, context) => {
  const _ = db.command;
  try {
    return await db.collection('address').doc(event._id).update({
      data: {
        name: event.name,
        phone: event.phone,
        province: event.province,
        city: event.city,
        district: event.district,
        detail: event.detail,
        isdefault: event.isdefault,
      },
      success: function(res) {
       
      }, fail: err => {

      }
    })
  } catch(e) {
    console.log(e);
  }
}
4.查
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 获取当前用户的地址
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  const _ = db.command;  //引入查询指令
  try {
    return await db.collection('address').where({
      userid: _.eq(wxContext.OPENID)    //eq查询指令 表示等于
    }).orderBy('createTime','desc').get()   //按时间排序
  } catch(e) {
    console.log(e);
  }
}

limit(10) 表示取前10条数据 加在get前
支持的查询指令
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/query.html

5.多表查询
 return await db.collection('cart').aggregate()
    .match({
      userid: wxContext.OPENID,
      selected: true
    }).lookup({
        from: 'goods',   //关联的表名
        localField: 'goodsid',  //关联表名的字段
        foreignField: '_id',   //源表的字段
        as: 'info'   //组装成的对象
      }).end()

注:where()和aggregate()不能共存,where()最后接get(),aggregate()最后接end()

6.模糊查询
db.collection('goods').where(_.or([  //or表示接受多个查询条件
{
      name: db.RegExp({       //模糊查询   
        regexp: '.*' + event.name,
        options: 'i',
      })
    },
    {
      subtitle: db.RegExp({  //组装成正则
        regexp: '.*' + event.name, // 正则表达式,字符串形式
        options: 'i',   //表示忽略大小写
      })
    }
    ])).get()
7.分页查询
db.collection('todos').skip(10)   //指定查询返回结果时从指定序列后的结果开始返回
  .get()
  .then(console.log)
  .catch(console.error)

三、对接腾讯云短信服务

腾讯短信服务控制台 https://console.cloud.tencent.com/smsv2
短信Api https://cloud.tencent.com/document/product/382/38778
(控制台里面居然找不到api的入口)

短信介绍


进入接口调试页面
image.png

在腾讯云控制台找到对应的参数,添加,然后在线调用成功之后就可以直接复制代码

测试的时候需要在本地安装一下依赖,右键云函数文件夹->在外部终端窗口打开-> 运行 npm install tencentcloud-sdk-nodejs --save 即可,上传云函数时,依然可以选择云端安装依赖

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

const tencentcloud = require("tencentcloud-sdk-nodejs")


// 短信通知下单信息
exports.main = async (event, context) => {
  const SmsClient = tencentcloud.sms.v20190711.Client;
  const clientConfig = {
    credential: {     //api的秘钥id和密码    https://console.cloud.tencent.com/cam/capi  中生成
      secretId: "",     
      secretKey: "",
    },
    region: "",
    profile: {
      httpProfile: {
        endpoint: "sms.tencentcloudapi.com",
      },
    },
  };
  
  const client = new SmsClient(clientConfig);
  const params = {
      "PhoneNumberSet": [    //发送的号码
          "86187xxxxxxxx"     //国内的号码需要加 86
      ],
      "TemplateParamSet": [  //发送的参数 对应模板中的{1} {2}
          " ",
          " "
      ],
      "TemplateID": "xxx",    //短信模板ID
      "SmsSdkAppid": "xxxx",   //SDKAppID  在短信的应用列表中获取   https://console.cloud.tencent.com/smsv2/app-manage
      "Sign": "xxx"    //短信签名内容  即模板中【】中的内容
  };
  client.SendSms(params).then(
    (data) => {
      console.log(data);
      return data
    },
    (err) => {
      console.error("error", err);
      return err
    }
  );
}

四、云开发的优缺点

优点:利用云函数可以很轻松的获取用户OPENID,操作数据库这些,省了https配置。
缺点: 云函数访问速度很慢,不知道等5g普及之后会不会改变

最后,云小程序有提供CMS,还没用过,不知道好不好用。

你可能感兴趣的:(云开发踩坑)