云开发
- 微信于2018年9月份公测小程序云开发
发起请求
官方推荐依赖包:request
- npm install --save request
- npm install --save request-promise
发起请求
js
// 云函数入口文件【必须先初始化才能调用别的API】
const cloud = require('wx-server-sdk')
cloud.init()
// 连接数据库
const db = cloud.database() // 不填写为默认环境的数据库
const actions = db.collection('actions') // 选择操作的集合
const rp = require('request-promise') // 使request支持promise
// 查询请求的IP地址【查询ico】
const url = `https://m.xxx.com/list`
// 云函数入口函数
exports.main = async (event, context) => {
// event:小程序端传递的data参数
//【注意:在小程序端调用系统会往event对象注入userinfo对象,如下】
// userInfo: {appId: "xxxxx", openId: "xxxxx"}
// openId为用户Id,appId为小程序Id
console.log(event)
// context:包含了此处调用的调用信息和运行状态,一般用不到
console.log(context)
// 除event外,也可以使用如下方式获取openid和appid
const wxContext = cloud.getWXContext()
console.log(wxContext.appid, wxContext.openid)
console.log(wxContext) // 包含环境信息,一般也用不到
// 发起请求
let {list} = await rp.get(url)
// 获取集合所有数据
let data = await actions.get()
return {
list,
data
}
}
定时任务
config.json配置
js
// config.json
{
"triggers": [
{
"name": "myTimer",
"type": "timer",
"config": "*/5 * * * * * *" // 每5秒触发一次云函数
}
]
}
// index.js
const cloud = require('wx-server-sdk')
cloud.init()
// 连接数据库
const db = cloud.database()
const actions = db.collection('actions')
exports.main = async (event, context) => {
// 定时器触发:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/triggers.html
let id = await actions.add({
data: [{
name: Date.now(),
type: '定时器测试'
}]
})
return {
id
}
}
注意: 函数必须上传并部署,且进行“上传触发器”。不需要使用了可以删除。
tcb-router
- 基于koa风格的路由库,用于优化服务端函数处理逻辑。云函数数量有上限,可以用于优化。但是不能盲目在一个函数中使用,可能会造成性能问题。
云函数编写
- 在需要使用tcb-router的云函数目录安装依赖:npm i -S tcb-router
js
// 云函数入口文件
const cloud = require('wx-server-sdk')
const TcbRouter = require('tcb-router')
cloud.init()
exports.main = async (event, context) => {
// event必传,不传会ctx.body返回null,原理暂时未知
let app = new TcbRouter({event}) // 自动处理路由参数与路由转发
// 公共路由(都会走进来)
app.use(async (ctx, next) => {
// ctx对象中无重要属性,做洋葱模型传递使用
ctx.data = {}
next()
console.log('end...')
})
// 适用于$url: 'test1'路由
app.router('test1', async (ctx, next) => {
ctx.data.name1 = 'test1-1'
next() // 调用下一个中间件
}, async (ctx, next) => {
ctx.data.name2 = 'test1-2'
// 使用ctx.body返回给小程序
ctx.body = {
code: 0,
data: ctx.data
}
})
// 适用于$url: 'test2'路由
app.router('test2', async (ctx, next) => {
ctx.data.name = 'test2'
// 返回给小程序
ctx.body = {
code: 0,
data: ctx.data
}
})
return app.serve() // 必须return app.serve()
}
小程序调用
js
wx.cloud.callFunction({
name: 'tcb-router-test',
data: {
$url: 'test1', // $url为tcb-router路由匹配参数
other: {}
}
}).then((data) => {
console.log(data)
})