微信小程序云函数和云数据库
数据库request-promiseRequest-Promisenpm install --save requestnpm install --save request-promise
·
参考: 小程序数据库文档
安装request-promise
使用request-promise实现服务器接口数据请求。
npm install --save request
npm install --save request-promise
创建云数据库集合
创建一个名为playlist的数据库集合
编写云函数
这里云函数的作用是将接口返回的数据插入云数据库。
新建名为getplaylist的云函数,用于获取歌单数据,并将数据插入云数据库
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const rp = require('request-promise');
const URL = 'http://xx.xx.xx/xx'
// 云函数入口函数
exports.main = async(event, context) => {
const playlist = await rp(URL).then((res) => {
return JSON.parse(res).result
})
for (let i = 0, len = playlist.length; i < len; i++) {
await db.collection('playlist').add({
data: {
...playlist[i],
createTime: db.serverDate(),
}
}).then((res) => {
console.log('插入成功')
}).catch((res) => {
console.log('插入失败')
})
}
}
点击 运行测试 按钮,运行成功后,查看数据库,如下:
我们可以使用高级操作,使用count模板查询数据的条数。
点击执行按钮后,可以看到查询的count为30条。
数据去重处理
从服务端接口请求的数据有可能和云数据库中的数据重复,所以需要进行去重处理。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const rp = require('request-promise');
const URL = 'http://musicapi.xiecheng.live/personalized'
const playlistCollection = db.collection('playlist')
// 云函数入口函数
exports.main = async(event, context) => {
//云数据库中已有的数据
const list = await playlistCollection.get()
//服务器端请求的数据
const playlist = await rp(URL).then((res) => {
return JSON.parse(res).result
})
//用于存储去重后的数据集合
const newData = []
for (let i = 0, len1 = playlist.length; i < len1; i++) {
let flag = true
for (let j = 0, len2 = list.data.length; j < len2; j++) {
if (playlist[i].id === list.data[j].id) {//id相等说明是重复数据
flag = false
break
}
}
//不是重复数据,添加到newData集合中
if (flag) {
newData.push(playlist[i])
}
}
//去重后的数据集合添加到云数据库
for (let i = 0, len = newData.length; i < len; i++) {
await playlistCollection.add({
data: {
...newData[i],
createTime: db.serverDate(),
}
}).then((res) => {
console.log('插入成功')
}).catch((err) => {
console.error('插入失败')
})
}
return newData.length
}
数据条数的限制
每次从云数据库中请求数据有100条限制,我们通过多次请求,整合多次请求结果的方式来去除条数的限制,使用Promise实现。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const rp = require('request-promise');
const URL = 'http://xx.xx.xx/xx'
const playlistCollection = db.collection('playlist')
const MAX_LIMIT = 100
// 云函数入口函数
exports.main = async(event, context) => {
//云数据库数据的总条数
const countResult = await playlistCollection.count()
const total = countResult.total
//分批次,比如total=220,220除以100并向上取整等于3.
const batchTimes = Math.ceil(total / MAX_LIMIT)
const tasks = []
for (let i = 0; i < batchTimes; i++) {
let promise = playlistCollection.skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
let list = {
data: []
}
//所有请求完成后,合并所有数据
if (tasks.length > 0) {
list = (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data)
}
})
}
//服务器端请求的数据
const playlist = await rp(URL).then((res) => {
return JSON.parse(res).result
})
//用于存储去重后的数据集合
const newData = []
for (let i = 0, len1 = playlist.length; i < len1; i++) {
let flag = true
for (let j = 0, len2 = list.data.length; j < len2; j++) {
if (playlist[i].id === list.data[j].id) {
flag = false
break
}
}
if (flag) {
newData.push(playlist[i])
}
}
for (let i = 0, len = newData.length; i < len; i++) {
await playlistCollection.add({
data: {
...newData[i],
createTime: db.serverDate(),
}
}).then((res) => {
console.log('插入成功')
}).catch((err) => {
console.error('插入失败')
})
}
return newData.length
}
定时触发器
如果云函数需要定时 / 定期执行,也就是定时触发,我们可以使用云函数定时触发器。配置了定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。
在需要添加触发器的云函数目录下新建文件 config.json,格式如下:
{
"triggers": [
{
"name": "myTrigger",
"type": "timer",
"config": "0 0 10,14,16,23 * * * *"
}
]
}
“config”: “0 0 10,14,16,23 * * * *” 意思是每天10、14、16、23点 触发触发器。
云函数超时时间配置
如果云函数比较复杂,执行时间较长,我们需要修改云函数超时时间配置。
更多推荐
已为社区贡献2条内容
所有评论(0)