第三方服务器nodejs获取微信小程序云数据库某一集合所有数据
后端 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);
}
);
}
}
}