欢迎光临
我们一直在努力

Bmob后端云初体验:从零到一构建全栈应用

引言

对于独立开发者、初创团队或个人学习项目来说,后端开发和服务器运维往往是成本最高、迭代最慢的环节。有没有一种方法可以跳过服务端编码,直接在前端完成数据存储、用户管理、文件上传、消息推送等常见功能?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 对象已经内置,无需初始化。此外,如果需要导入三方模块,可以在左侧“模块管理”中添加(比如 lodash、axios 等)。

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 官方文档、技术社区或者本文评论区留言,我会尽我所能给予解答。

赞(0)
未经允许不得转载:171主机测评 » Bmob后端云初体验:从零到一构建全栈应用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址