为什么用云开发:少写一个后端

做小程序最现实的门槛,往往不是前端页面本身,而是「后端从哪来」。数据要存、文件要放、接口要写,传统做法需要你自己买服务器、搭数据库、配域名证书,再请一个懂运维的人。对一个想快速验证想法的小团队来说,这套基础设施的成本和周期,远远超过业务本身。

云开发给出的答案是:把后端那一层直接托管到平台上。你不再关心服务器长什么样,只需要写一小段运行在云端的函数、声明几张数据表,就能让小程序拥有完整的存储与接口能力。它的价值不是「替你省一点钱」,而是把上线的时间从几周压缩到几小时。

云开发不是永远的终点,但它是最适合把一个想法快速变成可用产品的起点。
本文核心知识点
  • 云环境开通后即自带数据库、存储与函数运行空间,无需自建服务器。
  • 云函数运行在云端的一段 JS,前端用调用接口触发它,天然免鉴权直连数据库。
  • 云数据库提供类似文档的集合结构,前端与云函数都能直接读写。
  • 云存储用来放图片、文件,返回可访问的文件地址。
小程序云开发示意:云朵数据库立方体、函数模块与上传箭头组成的蓝调扁平科技插画
云开发把服务器、数据库、存储都收进一朵云里,开发者只写业务,不操心运维。

开通云环境与初始化

在开发者工具里新建项目时勾选「使用云开发」,或在已有项目的工具栏点开云开发面板,按提示开通一个环境。一个环境就是一套独立的资源,开发、测试、正式建议分别建环境,避免互相污染。

开通后在 app.js 里把云能力初始化,并告诉项目默认用哪个环境:

// app.js
App({
  onLaunch() {
    if (!wx.cloud) {
      console.error("当前基础库不支持云开发");
      return;
    }
    wx.cloud.init({
      env: "prod-1234567890",
      traceUser: true
    });
  }
});

初始化之后,前端才能调用 wx.cloud 提供的接口。几个概念先分清:

概念是什么典型用途
云环境一套隔离的云端资源区分开发、测试、线上
云函数运行在云端的 JS 函数写接口、做鉴权、批量数据处理
云数据库文档型集合存用户、订单、内容等结构化数据
云存储文件存储空间放图片、附件、音视频

把这四样东西的边界想清楚,后面写起来就不会乱。前端负责展示与交互,云函数负责不适合暴露给用户的逻辑,数据库与存储负责数据本身。

云函数:没有服务器也能写接口

云函数就是一个部署在云端、用 Node 运行的 JavaScript 函数。前端通过 wx.cloud.callFunction 触发它,它在云端执行完再把结果返回。它最大的好处是天然带着调用者的身份信息,不用你自己处理登录态。

// 云函数 login/index.js
const cloud = require("wx-server-sdk");
cloud.init();

exports.main = async () => {
  const { OPENID } = cloud.getWXContext();
  return { openid: OPENID };
};

前端调用这个函数,就能拿到当前用户在本小程序内的唯一标识:

wx.cloud.callFunction({
  name: "login"
}).then(res => {
  console.log("用户 openid", res.result.openid);
});

写云函数要注意几点:

  • 每个云函数是独立目录,上传时要在目录里单独安装依赖、单独打包。
  • 函数执行有超时上限,别在里面跑重计算,重的活交给定时任务。
  • 真正敏感的逻辑(如改价格、发券)必须放在云函数里,不能只靠前端。

把云函数当成「云端可调用的接口」来理解,你已有的前后端经验基本可以平移过来。

云数据库:像操作前端数据一样写库

云数据库是文档型的:你建一个集合(可以理解为一张表),里面放一条条结构自由的记录。前端在配置好权限后可以直接读写,云函数里更是拥有完整能力。

// 云函数里往集合 notes 插一条记录
const db = cloud.database();
exports.main = async () => {
  await db.collection("notes").add({
    data: { title: "第一条", done: false, createdAt: Date.now() }
  });
  return { ok: true };
};

查询时用链式方法拼装条件,和写前端数据操作很像:

  • collection("notes").where({ done: false }).get():按条件过滤。
  • .orderBy("createdAt", "desc"):按时间倒序。
  • .skip(n).limit(m):分页,避免一次拉太多。

权限是新手最容易踩的坑:数据库集合默认是「仅创建者可读写」,意味着你不配置好,前端查不到别人的数据。集合权限要在云开发控制台里按业务需要逐项设置,不能想当然。

云存储与文件上传

图片、附件这类文件不该塞进数据库,而应放到云存储。前端选好文件后调用上传接口,云存储会返回一个文件标识,把这个标识存进数据库即可。

wx.chooseMedia({ count: 1 }).then(res => {
  const filePath = res.tempFiles[0].tempFilePath;
  return wx.cloud.uploadFile({
    cloudPath: "avatars/" + Date.now() + ".png",
    filePath: filePath
  });
}).then(up => {
  console.log("已上传,文件标识", up.fileID);
});

几个实操要点:

  • cloudPath 是文件在云端的存放路径,自己定,建议按日期或用户分目录,避免堆积。
  • 拿到的 fileID 可以直接放进 image 组件的 src,无需额外转链接。
  • 大图先在前端压缩再上传,既省流量也加快上传速度。

这样,前端展示、数据存取、文件上传三件套就齐了,一个内容类工具型小程序的后端已经足够。