云函数的使用

cloudfunctions 目录 右键 新建 Node.js 云函数 > 输入目录名 getPlaylist

在云函数中向第三方服务器发送请求要依赖第三方库

安装依赖包

云函数目录 getPlaylist 右键 在终端打开 打开命令行 输入命令:

1
2
npm install --save request
npm install --save request-promise

github request-promise:https://github.com/request/request-promise

然后写相应代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 云函数入口文件
const cloud = require("wx-server-sdk");

cloud.init();

const rp = require("request-promise"); // 需安装依赖包

const URL = "http://musicapi.xiecheng.live/personalized";

// 云函数入口函数
exports.main = async (event, context) => {
const playlist = await rp(URL).then((res) => {
return JSON.parse(res).result;
});
console.log(playlist);
};

写完代码,云函数目录 getPlaylist 右键 上传并部署:云端安装依赖(不上传node_modules) 进行上传部署代码到云端,等待上传成功,打开云开发控制台即可看到已经上传的云函数,并可对云函数进行测试。

数据库操作

数据库> 创建集合 > playlist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 云函数入口文件
const cloud = require("wx-server-sdk");

cloud.init();

const db = cloud.database(); // 初始化数据库,如果在小程序端初始化数据库需要在前面加wx.

const rp = require("request-promise"); // 需安装依赖包

const URL = "http://musicapi.xiecheng.live/personalized"; // 第三方服务器地址(老师从网易云获取的数据部署在其服务器,每天的数据会更新)

const playlistCollection = db.collection("playlist"); // 获取到数据库playlist集合

const MAX_LIMIT = 10; // 定义常量,获取数据库条数最大的限制

// 云函数入口函数
exports.main = async (event, context) => {
/**
* 注:
* - 关于数据库的操作都是异步操作,都需添加await关键字
* - console.log 打印在云开发控制台 云函数测试内查看
* - 单次获取数据库数据有条数限制,云函数端最多获取100条,小程序端最多获取20条
*/

// const list = await playlistCollection.get() // 获取数据库集合的数据 (因为有条数限制,不直接用此方法)

// 突破条数限制 (为了读取到全部数据然后与第三方服务器获取的数据进行对比去重)
const countResult = await playlistCollection.count(); // 获取数据总条数 返回为对象
const total = countResult.total; // 取得总条数
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(); // 从第 skip 条开始取,最多取 limit 条数据
tasks.push(promise);
}
let list = {
data: [],
};
if (tasks.length > 0) {
list = (await Promise.all(tasks)).reduce((acc, cur) => {
// reduce数组方法 累积拼接
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(), // db.serverDate() 获取服务器时间
},
})
.then((res) => {
// 数据添加成功
console.log("数据添加成功");
})
.catch((err) => {
// 失败
console.error(err);
});
}
return newData.length; // 插入多少条数据
};
查询数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//云函数中查询数据库的例子:

// 云函数入口文件
const cloud = require("wx-server-sdk");

cloud.init();

const TcbRouter = require("tcb-router");
const db = cloud.database(); // 初始化数据库
const blogCollection = db.collection("blog"); // 博客的数据库集合

// 云函数入口函数
exports.main = async (event, context) => {
const app = new TcbRouter({ event }); // 初始化TcbRouter

app.router("list", async (ctx, next) => {
// skip 从第几条开始查,limit 查几条数据,orderBy(排序字段,排序方式) 排序,排序方式desc降序/asc升序
ctx.body = await blogCollection
.skip(event.start)
.limit(event.count)
.orderBy("createTime", "desc")
.get()
.then((res) => {
return res.data;
});
});

return app.serve(); // 必需返回
};
云函数调试

云控制台中可会云函数进行云端测试

在小程序调用云函数后,可查看云函数日志