• 微信小程序 多个小程序访问同一个云数据库,实现跨环境资源获取


    官方API  Link

    官方解释

    云开发支持跨账号环境(资源)共享,即一个小程序的云开发资源可以授权共享给同主体下其他小程序 / 公众号使用

     

    需求 

    已知两个或多个小程序,A,B...

    B需要访问A的云数据库进行操作,其他类似

     

    A端(资源方)操作

    创建一个云函数,名为 cloudbase_auth,将以下代码写入,同步

     1 const cloud = require('wx-server-sdk')
     2 cloud.init({
     3   env: cloud.DYNAMIC_CURRENT_ENV
     4 })
     5 
     6 // 云函数入口函数
     7 exports.main = async (event, context) => {
     8   const wxContext = cloud.getWXContext()
     9 
    10   console.log(event)
    11   console.log(wxContext)
    12   // 跨账号调用时,由此拿到来源方小程序/公众号 AppID
    13   console.log(wxContext.FROM_APPID)
    14   // 跨账号调用时,由此拿到来源方小程序/公众号的用户 OpenID
    15   console.log(wxContext.FROM_OPENID)
    16   // 跨账号调用、且满足 unionid 获取条件时,由此拿到同主体下的用户 UnionID
    17   console.log(wxContext.FROM_UNIONID)
    18 
    19   return {
    20     errCode: 0,
    21     errMsg: '',
    22     auth: JSON.stringify({
    23       // 自定义安全规则
    24       // 在前端访问资源方数据库、云函数等资源时,资源方可以通过
    25       // 安全规则的 `auth.custom` 字段获取此对象的内容做校验,
    26       // 像这个示例就是资源方可以在安全规则中通过 `auth.custom.x` 获取
    27       //x: 1,
    28     }),
    29   }
    30 }

    B端(需求方)操作

    创建一个云函数,用于请求A方资源,例如叫GetADB

    将以下代码写入GetADB保存后同步,注意修改自己的配置信息

     1 // 云函数入口文件
     2 const cloud = require('wx-server-sdk')
     3 
     4 
     5 // 云函数入口函数
     6 exports.main = async (event, context) => {
     7 
     8   // 声明新的 cloud 实例
     9   var c1 = new cloud.Cloud({
    10     // 资源方 AppID
    11     resourceAppid: '修改为A的AppID',
    12     // 资源方环境 ID
    13     resourceEnv: '修改为A的环境ID',
    14   })
    15 
    16   // 跨账号调用,必须等待 init 完成
    17   // init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
    18   await c1.init()
    19 
    20   // 完成后正常使用资源方的已授权的云资源
    21   return new Promise(async (resolve, reject) => {
    22     
    23     //多数报错504002什么的,都是没写下面这段代码,或者查询的数据库不存在导致
    24     const db = c1.database()
    25     await db.collection('数据库名称').limit(1000)
    26     //查询条件
    27       .field({
    28         id: true
    29       })
    30       .get()
    31       .then(res => {
    32         console.log('获取-A数据库-成功',res)
    33         resolve(res.data)
    34       })
    35       .catch(err => {
    36         console.log('获取-A数据库-失败',err)
    37         reject(err)
    38       })
    39   })
    40 
    41 }

    测试请求

    在小程序B调用自己的云函数GetADB

     1  async GetADB(){
     2     await wx.cloud.callFunction({
     3       name:'GetADB'
     4     })
     5     .then(res=>{
     6       console.log(res);
     7     })
     8     .catch(err=>{
     9       console.log(err);
    10     })
    11   }

    处理后的返回结果

    时间若流水,恍惚间逝去
  • 相关阅读:
    为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?
    MySQL主从复制什么原因会造成不一致,如何预防及解决?
    PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件
    垃圾分类小程序(1)——实现查找垃圾的类别
    python上的数据库sqlite3——插入多行数据
    pandas.DataFrame——pd数据框的简单认识、存csv文件
    Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性
    第一个爬虫——豆瓣新书信息爬取
    Decorator——Python初级函数装饰器
    正则表达式——字符类、分支条件、分组
  • 原文地址:https://www.cnblogs.com/alanshreck/p/14335285.html
Copyright © 2020-2023  润新知