bookworm-smart-assistant/skills/miniprogram-expert/references/cloud-dev.md

3.6 KiB

小程序云开发指南

初始化

// app.js
App({
  onLaunch() {
    wx.cloud.init({
      env: 'your-env-id',
      traceUser: true
    })
  }
})

云数据库

基础操作

const db = wx.cloud.database()
const _ = db.command

// 添加
const { _id } = await db.collection('todos').add({
  data: { title: '待办', done: false, createTime: db.serverDate() }
})

// 查询
const { data } = await db.collection('todos')
  .where({ done: false, createTime: _.gt(new Date('2024-01-01')) })
  .orderBy('createTime', 'desc')
  .skip(0)
  .limit(20)
  .field({ title: true, done: true })
  .get()

// 更新
await db.collection('todos').doc(id).update({
  data: { done: true, updateTime: db.serverDate() }
})

// 路径更新
await db.collection('users').doc(id).update({
  data: { 'profile.avatar': newUrl }
})

// 删除
await db.collection('todos').doc(id).remove()

// 批量更新(需云函数)
await db.collection('todos').where({ done: true }).update({
  data: { archived: true }
})

查询操作符

const _ = db.command

// 比较
_.eq(val)    // 等于
_.neq(val)   // 不等于
_.gt(val)    // 大于
_.gte(val)   // 大于等于
_.lt(val)    // 小于
_.lte(val)   // 小于等于
_.in([1,2])  // 在数组中
_.nin([1,2]) // 不在数组中

// 逻辑
_.and([cond1, cond2])
_.or([cond1, cond2])
_.not(cond)

// 示例
db.collection('orders').where({
  status: _.in(['pending', 'processing']),
  amount: _.gt(100).and(_.lt(1000))
})

聚合查询

const $ = db.command.aggregate

const { list } = await db.collection('orders')
  .aggregate()
  .match({ status: 'paid' })
  .group({
    _id: '$userId',
    total: $.sum('$amount'),
    count: $.sum(1),
    avgAmount: $.avg('$amount')
  })
  .sort({ total: -1 })
  .limit(10)
  .end()

实时数据

const watcher = db.collection('messages')
  .where({ roomId: 'xxx' })
  .orderBy('createTime', 'desc')
  .limit(50)
  .watch({
    onChange(snapshot) {
      console.log('变化:', snapshot.docs)
      console.log('变化类型:', snapshot.docChanges)
    },
    onError(err) { console.error(err) }
  })

// 关闭
watcher.close()

云函数

创建云函数

// cloudfunctions/getUser/index.js
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()

exports.main = async (event, context) => {
  const { OPENID, APPID } = cloud.getWXContext()
  
  try {
    const { data } = await db.collection('users')
      .where({ _openid: OPENID })
      .get()
    
    return { code: 0, data: data[0] || null }
  } catch (error) {
    return { code: -1, message: error.message }
  }
}

调用云函数

const res = await wx.cloud.callFunction({
  name: 'getUser',
  data: { userId: '123' }
})
console.log(res.result)

定时触发器

// config.json
{
  "triggers": [{
    "name": "dailyTask",
    "type": "timer",
    "config": "0 0 2 * * * *"
  }]
}

云存储

// 上传
const { fileID } = await wx.cloud.uploadFile({
  cloudPath: `images/${Date.now()}.png`,
  filePath: tempFilePath
})

// 获取临时链接
const { fileList } = await wx.cloud.getTempFileURL({ fileList: [fileID] })
const url = fileList[0].tempFileURL

// 下载
const { tempFilePath } = await wx.cloud.downloadFile({ fileID })

// 删除
await wx.cloud.deleteFile({ fileList: [fileID] })

云托管

// 调用云托管服务
const res = await wx.cloud.callContainer({
  config: { env: 'prod-xxx' },
  path: '/api/users',
  method: 'POST',
  data: { name: 'test' }
})