参考: 小程序数据库文档

安装request-promise

使用request-promise实现服务器接口数据请求。

Request-Promise的github

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点 触发触发器。


在这里插入图片描述

云函数超时时间配置

如果云函数比较复杂,执行时间较长,我们需要修改云函数超时时间配置。

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐