Skip to content

云开发

  • 微信于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)
})