第三方服务器nodejs获取微信小程序云数据库某一集合所有数据
发布于 3 年前 作者 yongxu 3332 次浏览 来自 分享

后端 nodejs

将前端发送的请求在后端进行处理(好处就是不涉及跨域问题

思路:

  • 1、获取集合数据前 需要 获取集合数据总量 ,total。
  • 2、获取集合数据总量的方法在微信小程序文档中为 获取特定云环境下集合信息(databaseCollectionGet) ,该api请求地址为
POST https://api.weixin.qq.com/tcb/databasecollectionget?access_token=ACCESS_TOKEN

  • 3、获取集合数据的方法为 数据库查询记录(databaseQuery),请求地址为
POST https://api.weixin.qq.com/tcb/databasequery?access_token=ACCESS_TOKEN
  • 4、两个api都需要access_token(获取小程序全局唯一后台接口调用凭据),该凭证有效期仅为7200秒,为避免重复获取导致失效等其它问题,需要将该token保存在后端某txt文件中。请求地址为
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
  • ps:除了请求地址,所需参数在微信小程序文档中有详细地介绍,真实参数的请求格式我会发布出来以便大家参考,在此不加赘述。

实现:源码

  • 该js文件需要依赖:
//total_data.js
const request = require("request"); //服务端发送请求需要npm i request
const fs = require("fs");
const path = require("path");      //保存accessToken凭证路径
  • 获取accessToken思路:获取-保存-读取时判断是否需要再次获取(7200秒有效期)
//接上
//appid与appsecret都可在「微信公众平台 - 设置 - 开发设置」页中获得
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=${data.grant_type}&appid=${data.appid}&secret=${data.appsecret}`;

//token获取之后的保存路径 
const filePath = path.join(
  __dirname,
  "public",
  "accessToken",
  "/token.txt"
);

//读取txt文件判断token是否过期
const readAccessToken = () => {
  try {
    const data = fs.readFileSync(filePath);
    accessToken = JSON.parse(data);
    if (accessToken.expires_in > Date.parse(new Date())) {
      //有效期
      return Promise.resolve(accessToken.access_token);
    } else {
      //过期
      return updateAccessToken();
    }
  } catch (err) {
    //文件为空
    return updateAccessToken();
  }
};
//获取微信token
const updateAccessToken = () => {
  return new Promise((resolve, reject) => {
    //默认的get请求方式
    request(url, (err, response, body) => {
      let accessToken = JSON.parse(response.body);
      accessToken["expires_in"] = Date.parse(new Date()) + 7200 * 1000;
      fs.writeFileSync(filePath, JSON.stringify(accessToken));
      resolve(accessToken.access_token);
    });
  });
};
  • 接收来自前端的命令,判断传递的参数为获取total还是data进行操作
// 接上
// 获取小程序数据库数据
module.exports = async (req, res) => {
  const data = req.body.params;
  //接收传递页码数据
  const size = data.pagesize;
  const num = data.pagenum;
  const only = data.query;
//key值为读取txt文件获取的token值
  const key = await readAccessToken().then((res) => {
    return res;
  });

if (data === "info") {
    //获取total
    const urlInfo = `https://api.weixin.qq.com/tcb/databasecollectionget?access_token=${key}`;
    //集合参数
    const infoData = {
      env: "云开发环境ID",
      limit: 5,
      offset: 0,
    };
    request(
      {
        url: urlInfo,
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(infoData),
      },
      (error, response, body) => {
        const { collections } = JSON.parse(body);
        res.send(collections[2]); //我所需集合的index
      }
    );
  } else {
    //获取数据库 post请求
    const urlData = `https://api.weixin.qq.com/tcb/databasequery?access_token=${key}`;
    //搜索单个数据query参数
    const querydata = {
      env: "云开发环境ID",
      query: `db.collection("集合名").where({detail:${only}}).limit(${size}).skip(${
        (num - 1) * size
      }).get()`,
    };
    //全部数据query参数
    const queryAlldata = {
      env: "云开发环境ID",
      query: `db.collection("集合名").where({}).limit(${size}).skip(${
        (num - 1) * size
      }).get()`,
    };
    if (only) {
      console.log("only");
      //搜索数据
      request(
        {
          url: urlData,
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify(querydata),
        },
        (error, response, body) => {
          const { data } = JSON.parse(body);
          const newData = [];
          for (let i = 0, j = data.length; i < j; i++) {
            newData.push(JSON.parse(data[i]));
          }
          res.send(newData);
        }
      );
    } else {
      //所有数据
      request(
        {
          url: urlData,
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify(queryAlldata),
        },
        (error, response, body) => {
          const { data } = JSON.parse(body);
          const newData = [];
          for (let i = 0, j = data.length; i < j; i++) {
            newData.push(JSON.parse(data[i]));
          }
          res.send(newData);
        }
      );
    }
  }
}
回到顶部