过年这几天写了一个小程序,练手云开发,因为之前用过几次Node.js想到云开发也支持,就试试了,反正微信免费的额度也够了。
涉及的内容
注意几个坑啊:云函数配置文件加上权限列表,订阅消息和模板消息不一样。
小程序简介:
我这里小程序后端是Node.js写的爬虫(用的云开发)
提供brainyquote每日的英文推荐,支持搜索,订阅每日推送。
开始
前端
小程序:UI看图就好了。

订阅页面

云函数:

开始引入云函数:首先建立一个文件夹用来放云函数(其实就是一个云端的Node.js函数)。
我的是 fcs 然后你需要在项目配置文件里加上这个目录:

然后fcs就有了云的图标。
右键就可以新建云函数。
看一个最基本的云函数,也会用到,获取用户的openid
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
const cloud = require('wx-server-sdk') cloud.init()
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext() return { event, openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
|
右键上传部署云端。
我们在小程序端调用一下看看。
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
| wx.cloud.callFunction({
name: "quote-openid"
}).then((res) => {
console.log('openid')
console.log(res.result);
this.setData({
userInfo: res.result
})
}).catch((error) => {
wx.showToast({
title: 'load Failed',
})
})
|
可以看到是一个Promise的函数。用的wx.cloud.callFunction()来调用我们的云函数,这里注意你的云环境要提前初始化,我在app.js初始化的:wx.cloud.init()
如果你想给云函数加参数:xxcallFunction({data:{xxxx}}),云函数里面用event.xx来使用。
我们的数据都是通过云函数提供的,其实就是几个node.js爬虫,用的requests和cheerio模块。写完云函数,可以本地部署测试一下。
这里不说node了,可以去看一下文档,有js基础,很容易。
现在拿到数据,小程序基本可以用了,但是,我们要做的个性化啊,比如搜索:用到了云函数加参数,上面说了。
更进一步,我们加个订阅消息,每天给用户推送一句英文语录。
先去小程序后台添加一个消息模板,拿到模板ID后。
requestSubscribeMessage
申请订阅消息,我写到工具模块了,可以直接用。
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| const order = function(db,openid){
wx.requestSubscribeMessage({
tmplIds: ['模板ID'],
success(res) {
if (res['模板ID'] === 'accept') {
console.log('开始更新订阅记录')
wx.cloud.callFunction({
name: "quote-sub"
}).then((res) => {
if (res.result.errMsg === 'collection.update:ok'){
console.log('更新订阅记录ok')
wx.showToast({
title: '订阅成功',
});
}else{
console.log('订阅成功,记录更新错误!')
console.log(res);
}
}).catch((error) => {
console.log('更新订阅记录失败')
wx.showToast({
title: 'load Failed',
})
})
} else {
console.log('未订阅过')
db.collection('users').add({
data: {
order: 1
}
}).then((res) => {
console.log(res)
})
}
}
})
} else {
wx.showToast({
title: '订阅失败',
})
}
},
fail(res) {
console.log(res)
wx.showToast({
title: '订阅失败',
})
}
})
};
module.exports = {
order:order
}
|
看看sub函数如何操作数据库的。
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 db = cloud.database()
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const _ = db.command
let status = await db.collection('users').where({ _openid: wxContext.OPENID }).update({
data: {
order: _.inc(1)
}
})
return status
}
|
订阅完成后,处理定时任务推送:要使用定时任务,需要在这个云函数的文件里加一个config.json的文件,填写一下配置,注意不可以有注释,不然提醒你部署触发器一直失败!
Cron语法,可以百度,微信官方也有说明,秒 分 时 xxx等 * 代表每
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "permissions": { "openapi": [ "subscribeMessage.send" ] }, "triggers": [ { "name": "order", "type": "timer", "config" : "0 30 08 * * * *" } ] }
|
添加一个新的云函数,调用订阅消息接口,这里是官方示例,注意模板字段格式!
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
| const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { try { const result = await cloud.openapi.subscribeMessage.send({ touser: 'OPENID', page: 'index', data: { number01: { value: '339208499' }, date01: { value: '2015年01月05日' }, site01: { value: 'TIT创意园' }, site02: { value: '广州市新港中路397号' } }, templateId: 'TEMPLATE_ID' }) console.log(result) return result } catch (err) { console.log(err) return err } }
|
我们要做的就是定时,循环给订阅的用户推送最新的英文语录,并且,记录减去1. 这里用到了云函数调用其它云函数,比如我们先拿到订阅用户列表,这里和小程序端是一样的用法。
1 2 3 4 5
| let users = (await cloud.callFunction({
name: 'quote-users'
})).result;
|
然后遍推送:
1 2 3 4 5 6 7 8 9
| for(let i of users){
console.log(i);
cloud.openapi.subscribeMessage.send({
xxxxxx
|
完成后,右键云函数:部署云端,部署触发器。
如果觉得没底,可以把cron改成5s的,先测试一下,或者手动触发调试。
—由于过年了,小程序还没审核完成,想体验一下的小伙伴,可以回复公众号:秋果科技工作室:quote 申请体验。
已经上线:微信搜索小程序:brainyquoteLite即可。

云开发后台
