云开发踩坑

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

一、云开发步骤

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,还没用过,不知道好不好用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容