Bmob后端云初体验:从零到一构建全栈应用
2026/8/7 12:23:29 网站建设 项目流程

引言

对于独立开发者、初创团队或个人学习项目来说,后端开发和服务器运维往往是成本最高、迭代最慢的环节。有没有一种方法可以跳过服务端编码,直接在前端完成数据存储、用户管理、文件上传、消息推送等常见功能?BaaS(Backend as a Service,后端即服务)由此诞生。Bmob 是国内老牌的后端云平台,提供了完整的数据API、云函数、权限管理和移动端SDK,帮助开发者只关注前端业务逻辑,真正实现“零后端代码、快速上线”。本文将用超过两万字的篇幅,从零开始讲解 Bmob 后端云的核心功能、实操步骤和进阶技巧,并附上大量可直接运行的代码示例,带你全面掌握 Bmob 的使用方法,体验“后端即服务”带来的开发效率提升。

一、Bmob 简介与注册配置

1.1 什么是 Bmob?

Bmob 是国内起步较早的 BaaS 平台,底层基于私有云 + 公有云混合部署,为移动应用、Web 应用、小程序等提供云端数据存储、用户管理、文件存储、消息推送、云函数等一整套后端服务。它通过 REST API 和多种语言的 SDK(Android、iOS、JavaScript、微信小程序、PHP 等)屏蔽了服务端细节,开发者只需在前端调用几个方法,就能完成数据的增删改查和复杂的业务逻辑。Bmob 的核心优势在于:

  • 快速开发:无需编写任何服务端代码,极大地缩短项目周期。
  • 弹性扩展:随着用户量增长,平台会自动扩展数据库和容灾能力。
  • 多平台支持:一套数据模型,前端 iOS、Android、Web、小程序共享。
  • 丰富的 API:不仅支持基础 CRUD,还提供关联查询、地理位置、数组操作、原子计数器等高级功能。
  • 云函数:在服务端编写 Node.js 函数,实现自定义业务逻辑和定时任务。
  • 低门槛:免费额度完全可以支撑小型项目的 MV 阶段。

1.2 注册与创建应用

访问 Bmob 官网([https://www.bmob.cn/]),使用邮箱注册账号。注册成功后登录进入控制台,点击“创建应用”,填写应用名称(如“MyFirstApp”),然后选择运行环境:

  • 开发版(免费):适合开发测试,每秒请求数有限制(如 10 QPS),数据存储上限 500M。
  • 专业版 / 企业版:适合线上正式项目,提供更高的 QPS、定制功能和私有化部署。

新建应用后,进入“应用设置”页面,你会看到三个关键信息:

  • Application ID:应用唯一标识,所有 SDK 初始化都需要。
  • REST API Key:用于 REST API 身份验证,具有较高权限。
  • Secret Key:超级密钥,拥有所有权限,严禁暴露在前端代码中,仅在服务端(如云函数)使用。

同时,勾选需要启用的服务:数据存储、用户管理、文件存储、推送等。默认已经开启。接下来你就可以在 Web 版控制台直观地操作数据库,也可以直接使用 SDK 进行编程。

1.3 安装 SDK 并初始化

不同的平台需要引入对应的 SDK,我们以 JavaScript 环境(网页、Node.js)和微信小程序为例进行讲解。对于 Web 项目,可以直接在 HTML 中通过 script 标签引入 Bmob 的 JavaScript SDK:

<script src="https://cdn.bmob.cn/sdk/bmob-js@1.4.0.min.js"></script> <script> // 初始化 Bmob,替换成你自己的 Application ID 和 REST API Key Bmob.initialize("你的Application ID", "你的REST API Key"); </script>

如果你使用 Node.js 服务端或构建工具(webpack 等),可以通过 npm 安装:

npm install hydrogen-js-sdk

然后在代码中引入:

import Bmob from 'hydrogen-js-sdk'; Bmob.initialize("你的Application ID", "你的REST API Key");

对于微信小程序,需要在 app.js 中引入并初始化:

// app.js const Bmob = require('./utils/bmob.js'); Bmob.initialize("你的Application ID", "你的REST API Key");

至此,Bmob 的准备工作就完成了。下面我们开始学习最核心的部分——数据存储。

二、数据存储实战

2.1 数据模型与 Object

Bmob 采用无模式(Schemaless)的数据库,你不需要像传统关系数据库那样预先定义表结构,只需直接向“表”中插入数据即可。每一张表在 Bmob 中被称为一个Class,表中的一行数据称为一个Object。每个 Object 都有一个唯一的 objectId,以及自动添加的 createdAt、updatedAt 时间戳。

常见的操作包括:增加(Add)查询(Query)更新(Update)删除(Delete)。接下来以“文章管理”为例,演示如何操作一个名为“Article”的 Class。

2.2 新增数据(Create)

使用 JavaScript SDK 新增一条数据非常简单。首先创建一个对象,指定 Class 名称,然后设置字段值,最后调用 save 方法。

// 引入并初始化 Bmob,假设已完成 const Article = Bmob.Object.extend("Article"); const article = new Article(); article.set("title", "Bmob后端云初体验"); article.set("author", "CSDN"); article.set("content", "这是一篇关于Bmob的详细教程,内容超过两万字..."); article.set("views", 0); article.save().then(res => { console.log("文章新增成功,objectId:" + res.id); }).catch(err => { console.error("新增失败:" + err); });

如果需要在保存时附带额外的服务端操作(如原子计数、ACL设置),可以在 save 时传入第二个参数。新增成功后,你可以在 Bmob 控制台的“数据服务”->“Article”表中看到新记录。

2.3 查询数据(Query)

Bmob 提供了非常强大的条件查询,类似于 SQL 中的 WHERE 子句,但完全通过链式调用实现。以下示例演示如何查询单条、多条、带条件和排序的数据。

查询所有记录
const Article = Bmob.Object.extend("Article"); const query = new Bmob.Query(Article); query.find().then(results => { console.log("共查询到 " + results.length + " 条文章"); results.forEach(article => { console.log(article.get("title")); }); }).catch(err => console.error(err));
条件筛选
// 查询 title 为 "Bmob后端云初体验" 的文章 query.equalTo("title", "Bmob后端云初体验"); // 或者模糊查询(正则) query.matches("title", "Bmob.*"); // 查询 views 大于 100 的文章 query.greaterThan("views", 100); // 查询 author 包含在指定数组中的文章 query.containedIn("author", ["CSDN", "Wiki"]);
排序与分页
query.descending("createdAt"); // 按创建时间降序 query.limit(10); // 每页 10 条 query.skip(0); // 跳过 0 条,相当于第一页
查询单条或根据 objectId 获取
query.get("具体的objectId").then(article => { console.log(article.get("content")); });
统计总数
query.count().then(count => console.log("文章总数:" + count));

Bmob 的查询系统还支持 or 查询、查询关联字段(Pointer、Relation)、正则表达式等,下文会详细展开。

2.4 更新与删除

更新一条已有记录

需要先获取到目标 objectId 的对象,或者直接构造一个带 id 的对象:

const article = Bmob.Object.createWithoutData("Article", "objectId值"); article.set("views", 100); article.save().then(res => console.log("更新成功")).catch(err => console.error(err));

为了减少网络传输,Bmob 也支持部分更新,即只发送变化的字段。

删除数据
article.destroy().then(res => console.log("删除成功")).catch(err => console.error(err));
批量删除

需要借助云函数或循环调用,前端直接批量删可能受 QPS 限制,建议在云函数中遍历 objectId 数组并调用 destroy。

2.5 关联查询(Relation、Pointer)

在真实项目中,表与表之间往往需要建立关联,比如一篇文章属于一个分类,或者一个用户拥有多篇文章。Bmob 提供了两种主要的关联方式:

  • Pointer(一对一 / 多对一):存储另一个对象的 objectId 引用。
  • Relation(多对多):专门用于多对多关系,可方便地进行关联查询和反向查询。
Pointer 示例(文章属于某个分类)

我们新建一个 Category 表,用以存储文章分类。创建一篇新文章时,将分类作为一个 Pointer 字段保存:

const Category = Bmob.Object.extend("Category"); const Article = Bmob.Object.extend("Article"); // 假设已有一个分类对象 categoryObj const article = new Article(); const pointer = Bmob.Pointer.createWithoutData("Category", categoryObj.id); article.set("category", pointer); article.set("title", "Bmob 进阶"); article.save();

查询文章时,如果需要同时获取分类信息,可以使用 include 方法:

const query = new Bmob.Query(Article); query.include("category"); query.find().then(results => { results.forEach(article => { const category = article.get("category"); if (category) console.log("分类名:" + category.get("name")); }); });
Relation 示例(用户收藏多篇文章)

用户(User)可以收藏多篇文章,一篇文章也可被多个用户收藏,这是典型的多对多关系。我们可以在 User 表或 Article 表上建一个 Relation 字段,然后在代码中添加关联:

const User = Bmob.Object.extend("_User"); const user = Bmob.Object.createWithoutData("_User", currentUserId); const relation = user.relation("favoriteArticles"); const article = Bmob.Object.createWithoutData("Article", articleId); relation.add(article); user.save();

查询某个用户收藏的所有文章:

const relation = user.relation("favoriteArticles"); relation.query().find().then(articles => { console.log("收藏的文章:" + articles.length); });

2.6 复杂查询:条件筛选、排序与分页

除了 equalTo 和 greaterThan 等基础操作符,Bmob 还支持:

  • notEqualTo:不等于。
  • containsAll:数组包含所有指定元素。
  • exists:指定字段是否有值。
  • or:组合多个条件(使用 Bmob.Query.or())。
  • limit / skip:分页。
  • addAscending / addDescending:多字段排序。

下面是一个“查询标题包含‘Bmob’且阅读量大于 50,并按创建时间降序排列,每页 10 条”的示例:

const query = new Bmob.Query(Article); query.matches("title", ".*Bmob.*"); query.greaterThan("views", 50); query.descending("createdAt"); query.limit(10); query.skip(page * 10); query.find();

2.7 批量操作与原子计数器

批量操作:虽然前端 SDK 没有直接提供批量保存的独立方法,但可以利用 Promise.all 并发处理。需注意并发数不要超过平台 QPS 限制。也可以将批量操作放到云函数中,利用 Secret Key 调用 REST API 的 batch 端点实现。

原子计数器:当需要安全地递增一个数字字段(如文章的阅读量)时,使用 increment 方法,避免并发覆盖问题:

const article = Bmob.Object.createWithoutData("Article", articleId); article.increment("views", 1); article.save();

这样无论有多少用户同时阅读,views 都能准确自增。

三、用户管理系统

3.1 注册与登录

Bmob 内置了完整的用户系统,表名为_User,默认包含 username、password、email、mobilePhoneNumber 等字段。可以通过 SDK 直接注册和登录。

注册新用户
const user = new Bmob.User(); user.set("username", "testuser123"); user.set("password", "mypassword"); user.set("email", "test@example.com"); user.signUp().then(res => { console.log("注册成功,userId:" + res.id); }).catch(err => console.error(err));
用户登录
Bmob.User.login("testuser123", "mypassword").then(user => { console.log("登录成功,当前用户:" + user.get("username")); }).catch(err => console.error("登录失败", err));

登录成功后,SDK 会自动存储用户的 sessionToken,后续所有需要权限的请求都会自动携带该 Token。你可以通过Bmob.User.current()获取当前登录用户。

3.2 SessionToken 管理与自动登录

在 Web 端,由于页面刷新会丢失内存中的登录状态,需要将 sessionToken 持久化到本地存储(localStorage),然后在应用启动时恢复:

// 登录时保存 token Bmob.User.login(username, password).then(user => { localStorage.setItem("bmob_token", user.getSessionToken()); }); // 应用初始化时尝试恢复登录 const token = localStorage.getItem("bmob_token"); if (token) { Bmob.User.become(token).then(user => { console.log("自动登录成功"); }).catch(err => { // Token 无效,清空本地数据 localStorage.removeItem("bmob_token"); }); }

小程序和 App 通常有自己的持久化机制,思路相同。

3.3 密码重置与邮箱验证

Bmob 支持通过邮箱发送密码重置邮件,需要先在控制台配置邮件模板并开启该功能,然后调用:

Bmob.User.requestPasswordReset("user@example.com").then(() => { console.log("重置邮件已发送"); }).catch(err => console.error(err));

邮箱验证主要用于注册时验证邮箱真实性,同样需要在控制台开启,并调用:

Bmob.User.requestEmailVerify("user@example.com");

3.4 第三方登录(微信、QQ、微博)

Bmob 集成了多家第三方平台的 OAuth 登录,以微信登录为例,需要先在控制台配置微信的 AppID 和 AppSecret,然后在前端调用:

// 微信小程序或公众号环境内,获取临时 code 后 Bmob.User.loginWithWeapp(code).then(user => { console.log("微信登录成功"); });

Web 端也可以通过微信开放平台进行扫码或授权登录,详细可参考 Bmob 官方文档。同样支持 QQ、微博等。

四、文件存储与图片处理

4.1 普通文件上传

Bmob 的文件服务支持图片、音频、视频、文档等多种格式,上传后返回一个可公网访问的 URL。使用 JavaScript SDK 上传本地文件(HTML file input):

const file = document.getElementById("fileInput").files[0]; const fileObj = new Bmob.File(file.name, file); fileObj.save().then(res => { console.log("文件上传成功,地址:" + res.url()); }).catch(err => console.error(err));

如果在上传时需要附带额外的数据入数据库,可以先将文件保存,然后将其关联到具体 Object:

const article = new Article(); article.set("title", "带附件文章"); const file = new Bmob.File("manual.pdf", pdfFile); file.save().then(res => { article.set("attachment", res); // 文件对象可作为一个字段保存 return article.save(); }).then(res => console.log("文章与附件保存成功"));

4.2 图片上传与缩略图

对于图片,Bmob 提供了 Image 和 Photo 两个类(继承自 File),支持缩略图处理。下面演示上传并获取宽度为 200 的缩略图:

const imageFile = document.getElementById("imgInput").files[0]; const img = new Bmob.Image("photo.jpg", imageFile); img.save().then(res => { console.log("原图地址:" + res.url()); const thumbUrl = res.thumbnailURL(200, 200); // 宽200,高按比例缩放 console.log("缩略图地址:" + thumbUrl); });

Bmob 图片处理依赖内置的实时图片处理服务,能够动态生成指定尺寸的缩略图,非常适合用户头像、商品列表等场景。

4.3 文件删除与 CDN 加速

删除已上传的文件:

const file = Bmob.Object.createWithoutData("Bmob.File", fileObjectId); file.destroy();

同时,Bmob 的文件默认托管在云端,访问速度较快;如需更极致的 CDN 加速,可联系官方配置独立域名。注意,文件上传需要在控制台开启“文件服务”模块,且免费版有一定存储和流量限制。

五、云函数(Cloud Code)

5.1 什么是云函数?

虽然客户端可以直接调用 API 操作数据库,但某些业务逻辑(如数据聚合、敏感计算、支付回调处理)不适合放到客户端执行,因为可能泄露 Secret Key 或被逆向篡改。Bmob 允许你在平台提供的 Node.js 环境中编写和部署函数,这些函数被称为云函数。云函数可以拥有服务端超级权限,调用 REST API 时使用 Secret Key,安全地完成复杂操作。

云函数编写基于 Node.js 8+(具体版本以控制台为准),支持 async/await、npm 第三方模块。你可以直接在控制台在线编辑,也可以使用命令行工具bmob-cli本地开发后部署。

5.2 编写第一个云函数

进入控制台 -> 云函数 -> 新建云函数,取名为“getArticleCount”,输入以下代码:

// 云函数中可通过 Bmob.Server 获得服务端上下文 Bmob.Cloud.run("getArticleCount", function(req, res) { var Article = Bmob.Object.extend("Article"); var query = new Bmob.Query(Article); query.count().then(count => { res.success({ count: count }); }).catch(err => { res.error(err); }); });

随后在客户端调用:

Bmob.Cloud.run("getArticleCount").then(result => { console.log("文章总数:" + result.count); });

注意:在线编辑器中Bmob对象已经内置,无需初始化。此外,如果需要导入三方模块,可以在左侧“模块管理”中添加(比如lodashaxios等)。

5.3 云端定时任务

云函数也可以设置为定时任务,类似于 cronjob。例如,每天凌晨统计当天新增文章数并发送邮件。在控制台创建定时任务时,只需指定云函数名和 cron 表达式即可。函数内部按普通云函数编写,执行完成后返回即可。

5.4 表级触发器(afterSave / beforeDelete)

Bmob 支持数据库触发器,允许在数据保存前后、删除前后自动执行云函数。例如,我们希望在每次新增文章时,自动在统计表里增加计数:

// 在云函数里定义 afterSave 触发器 Bmob.Cloud.afterSave("Article", function(request) { var object = request.object; // 新增文章逻辑... // 更新统计表(示例) var Stats = Bmob.Object.extend("Stats"); var query = new Bmob.Query(Stats); query.first().then(stat => { if (stat) { stat.increment("articleCount", 1); stat.save(); } }); });

请注意,触发器中不能无限循环调用 save,否则会陷入死循环,Bmob 有限制。合理使用触发器可以极大地简化解耦逻辑。

六、推送服务与即时通讯

6.1 推送配置

Bmob 集成了消息推送服务,支持 Android(基于华为/小米/魅族等厂商通道或极光推送)和 iOS(APNs)。你需要为应用配置推送证书或密钥,并在控制台开启推送功能。配置完成后,可以使用 REST API 或云函数发送推送。

6.2 发送推送消息

通过云函数或服务端 SDK 向指定设备、组或全部用户推送消息。下面是一个简单的云函数发送推送示例:

Bmob.Cloud.run("pushMessage", function(req, res) { var push = Bmob.Push.openClient(); push.setTitle("新文章提醒"); push.setMessage("《Bmob后端云初体验》更新了,快来学习吧!"); push.sendToAll().then(() => { res.success("推送成功"); }).catch(err => res.error(err)); });

也可以使用sendToChannels向感兴趣的频道发送,或者sendToDevice精确推送。端侧需要提前注册设备 token。

七、高级特性与权限控制

7.1 ACL 权限模型

Bmob 继承了 Parse 的 ACL 概念,允许你对每一条 Object 设置访问控制。ACL 包含该数据的可读(read)和可写(write)权限。默认情况下,创建的数据只有创建者本人可读写。你可以灵活设置:

const article = new Article(); const acl = new Bmob.ACL(); acl.setPublicReadAccess(true); // 任何人可读 acl.setWriteAccess(user, true); // 只允许某用户写 acl.setReadAccess(userId, true); // 允许指定用户读 article.setACL(acl); article.save();

这种方式在构建类似朋友圈、相册等应用时非常有用。

7.2 Role 角色管理

当需要分组管理权限时,可以创建角色(_Role 表),将用户批量添加到角色中,然后对数据批量赋予角色级权限。例如,为管理员角色赋予所有文章的写权限:

const role = new Bmob.Role("Admin", acl); role.getUsers().add(adminUser); role.save(); const articleACL = new Bmob.ACL(); articleACL.setRoleWriteAccess(role, true);

7.3 地理位置查询

Bmob 提供 GeoPoint 类型,支持附近查询。例如,查找离指定坐标最近的商家:

const Store = Bmob.Object.extend("Store"); const query = new Bmob.Query(Store); const currentPoint = new Bmob.GeoPoint({ latitude: 39.9, longitude: 116.4 }); query.near("location", currentPoint); query.limit(10); query.find();

还能查询某一矩形范围内的数据(withinKilometers、withinMiles 等)。

八、实战案例:搭建一个在线留言板

8.1 需求分析与数据库设计

我们来综合运用上述所学,构建一个无需后端代码的在线留言板。功能包括:用户注册登录、发表留言、查看所有留言、删除自己的留言。数据库设计:

  • _User(系统表)
  • Message(自定义表):字段 content(字符串)、user(Pointer 指向 _User)

8.2 后端接口实现(云函数)

由于留言列表需要关联查询用户信息,直接在前端进行 include 查询可能会暴露过多数据,也可能需要服务端权限进行复杂过滤。我们编写一个云函数getMessages来返回分页留言列表,并携带用户的部分公开信息:

Bmob.Cloud.run("getMessages", function(req, res) { const query = new Bmob.Query(Bmob.Object.extend("Message")); query.include("user"); query.descending("createdAt"); query.limit(req.params.limit || 20); query.skip(req.params.skip || 0); query.find().then(results => { const data = results.map(msg => { return { objectId: msg.id, content: msg.get("content"), username: msg.get("user") ? msg.get("user").get("username") : "匿名", createdAt: msg.createdAt }; }); res.success(data); }).catch(err => res.error(err)); });

同时,添加一个创建留言的云函数addMessage,在这里校验内容长度,并利用request.user获取当前登录用户(确保来自客户端登录态):

Bmob.Cloud.run("addMessage", function(req, res) { const user = req.user; if (!user) return res.error("请先登录"); const content = req.params.content; if (!content || content.length > 200) return res.error("内容长度非法"); const Message = Bmob.Object.extend("Message"); const msg = new Message(); msg.set("content", content); msg.set("user", Bmob.Object.createWithoutData("_User", user.id)); msg.save().then(obj => { res.success({ objectId: obj.id }); }).catch(err => res.error(err)); });

8.3 前端页面实现

我们使用纯 HTML + JS 来构建一个简易留言板,所有数据操作均通过云函数完成,页面包括登录、注册、留言列表和发表框。以下为关键代码片段(省略样式):

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>留言板</title> <script src="https://cdn.bmob.cn/sdk/bmob-js@1.4.0.min.js"></script> </head> <body> <div id="app"> <!-- 登录注册区域 --> <div id="auth"> <input type="text" id="username" placeholder="用户名"> <input type="password" id="password" placeholder="密码"> <button id="loginBtn">登录</button> <button id="regBtn">注册</button> </div> <!-- 留言区域 --> <div id="messageArea" style="display:none;"> <ul id="msgList"></ul> <textarea id="content"></textarea> <button id="sendBtn">发表</button> </div> </div> <script> Bmob.initialize("你的AppId", "你的RestKey"); // 登录、注册、获取留言、发送留言等逻辑 // 调用 Bmob.Cloud.run('getMessages', { skip: 0, limit: 20 }) // 调用 Bmob.Cloud.run('addMessage', { content: text }) // 此处省略完整事件绑定代码,实战中按部就班实现即可 </script> </body> </html>

通过以上步骤,一个具备用户认证、留言增删查的轻量应用就完成了,并且完全不需要部署任何服务端代码,所有后端逻辑都由 Bmob 承载。

九、Bmob 与其他 BaaS 平台的对比

目前市面上的 BaaS 平台主要包括 LeanCloud、Firebase(国内不可用)、知晓云、腾讯云开发等。Bmob 的突出特点在于:

  • 起步早、社区活跃:国内最早一批 BaaS 之一,有大量中文文档和案例。
  • 免费额度大方:开发版足以支撑个人项目和小型商业应用。
  • 插件丰富:推送、社交、支付等模块生态较全。
  • 私有化支持:提供企业级私有化部署方案。

不足之处在于部分高级功能(如即时通讯、实时数据)需要依赖第三方,以及云函数环境 Node.js 版本更新略慢。但对于绝大多数中轻度应用而言,Bmob 仍然是一个高效、稳定且成本极低的选择。

十、总结与未来展望

本文从零开始详细介绍了 Bmob 后端云的核心功能与使用技巧,包括数据存储、用户管理、文件上传、云函数、推送和权限控制等,并通过一个完整的留言板实战将知识串联起来。Bmob 让独立开发者和创业团队摆脱了后端桎梏,真正实现了“前端全栈”的开发模式。随着 BaaS 市场的成熟,Bmob 也在不断迭代,逐步引入更现代化的 GraphQL API 支持和 Serverless 容器化能力。希望本文能帮助你快速上手 Bmob,享受后端云带来的极致开发体验。

如果你在开发过程中遇到任何问题,可以访问 Bmob 官方文档、技术社区或者本文评论区留言,我会尽我所能给予解答。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询