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

官方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   }

处理后的返回结果

时间若流水,恍惚间逝去
原文地址:https://www.cnblogs.com/alanshreck/p/14335285.html