前端的全栈混合之路Meteor篇:运行在浏览器端的数据库-MiniMongo介绍及其前后端数据实时同步示例

news/2024/10/3 11:59:04 标签: 前端, 数据库, javascript, 全栈

Meteor 是一个全栈 JavaScript 框架,致力于简化 Web 应用开发。MiniMongo 是 Meteor 框架中的一个独特组件,它将 MongoDB 数据库的功能带到了客户端,使客户端能够像操作数据库一样,进行查询、插入、更新和删除操作。这使得前端开发者能够无缝地处理数据,同时享受 Meteor 的数据同步机制。

MiniMongo 是什么?

MiniMongo 是 MongoDB 的客户端版本,它在浏览器中运行,并模拟了 MongoDB 的核心功能。它允许开发者在客户端直接使用类似 MongoDB 的 API 进行数据库操作,比如 find()insertAsync()updateAsync()removeAsync() 等(前端因为数据在内存可去掉Async后缀也可保持前后端异步一致性)。

MiniMongo 最强大的特性之一是它支持实时数据同步。通过 Meteor 的数据传输机制,客户端的 MiniMongo 与服务器端的 MongoDB 保持数据同步,保证数据的一致性。这使得应用可以即时响应用户操作,而无需手动刷新页面或重新请求数据。

MiniMongo 的核心功能

MiniMongo 提供了以下核心功能:

  1. MongoDB API 操作: 客户端可以使用标准的 MongoDB 操作方法,如查询、插入、更新和删除。
  2. 实时数据同步: 客户端的 MiniMongo 会与服务器端的 MongoDB 自动同步,使得数据在客户端和服务器之间保持一致。
  3. 发布/订阅机制: Meteor 的 publishsubscribe 机制与 MiniMongo 协同工作,实现数据的按需加载。
  4. 响应式数据源: 通过 Tracker 和 Blaze 等响应式库,客户端的界面可以根据 MiniMongo 数据的变化自动更新。

前后端数据同步的实现

Meteor 的数据同步是通过其特有的发布/订阅 (Pub/Sub) 模型和数据传输层 (DDP) 实现的。以下是 Meteor 在前后端数据同步中的实现原理和步骤:

1. 数据集合的定义

在 Meteor 中,数据集合的定义可以共享在前端和后端。客户端使用 MiniMongo,后端使用 MongoDB。无论是在服务器端还是客户端,我们都可以通过同样的方式定义一个集合。

javascript">// 定义共享的集合
import { Mongo } from 'meteor/mongo';

export const Tasks = new Mongo.Collection('tasks');

这个集合的定义会在客户端被实例化为 MiniMongo,在服务器端实例化为 MongoDB 集合。

2. 服务器端发布数据

服务器通过 Meteor.publish() 来向客户端发布数据。发布的数据源自服务器的 MongoDB 集合。默认发布到前端的同名集合,也就是Tasks是前后端公用的变量(实现会有点差距,但接口一致)。

javascript">// server/main.js
import { Tasks } from '../imports/api/tasks.js';

Meteor.publish('tasks', function publishTasks() {
  return Tasks.find();  // 返回任务集合中的数据
});

服务器端定义了一个名为 tasks 的发布函数,将 Tasks 集合中的数据传递给客户端。

3. 客户端订阅数据

客户端通过 Meteor.subscribe() 订阅服务器发布的数据。当客户端订阅成功后,服务器上的数据会通过 DDP 协议实时传输到客户端的 MiniMongo 数据库

javascript">// client/main.js
import { Tasks } from '../imports/api/tasks.js';

Meteor.subscribe('tasks');

// 订阅完成后,客户端可以像操作 MongoDB 一样操作 MiniMongo
// 这个就有点类似vue的watchEffect, 它会在Tasks这个集合的数据变化时重新跑一下这个函数
Tracker.autorun(() => {
  const tasks = Tasks.find().fetch();
  console.log("Tasks from MiniMongo:", tasks);
});

在客户端,Meteor.subscribe('tasks') 订阅了服务器发布的任务数据,数据将存储在客户端的 MiniMongo 中,并且每次集合数据有变化时,都会自动更新。

4. 数据同步机制

Meteor 使用 DDP (Distributed Data Protocol) 协议来实现前后端的数据同步。DDP 是一种基于 WebSockets 的协议,用于在客户端和服务器之间传输数据。在客户端订阅数据时,DDP 会通过 WebSocket 通道持续地监听服务器端数据的变化,并将更新的数据推送给客户端。

客户端在 MiniMongo 中对数据的操作(如插入、删除、更新)同样通过 DDP 被传输到服务器。Meteor 的服务器会监听这些操作,更新 MongoDB 后再将结果反馈给客户端。整个过程是实时且双向同步的。

5. 插入和更新操作

由于 Meteor 的客户端和服务器端集合是同一个 API,当你在客户端执行插入、更新或删除操作时,这些变更会被自动同步到服务器端的 MongoDB 中。

服务端策略配置:

javascript">// 允许再server里面的代码,通过server.js引入
Tasks.allow({
   insert(user,doc){
     return !!user // 允许登录用户直接创建数据
   },
   remove(user,doc){
     return user===doc.userId // 允许删除属于自己的数据
   }
   // ..其它操作 update/upsert等
});

客户端插入数据:

javascript">// 前端client的代码
Tasks.insertAsync({
  text: "Learn MiniMongo",
  createdAt: new Date(),
});

当用户在客户端插入数据时,Meteor 会立即将这条数据添加到 MiniMongo 中,并通过 DDP 将操作传输到服务器,最终更新服务器端的 MongoDB 数据库

客户端更新数据:

javascript">// 前端client的代码
Tasks.updateAsync(taskId, {
  $set: { completed: true },
});

客户端的更新操作同样会立即影响 MiniMongo,并通过 DDP 同步到服务器。

6. 数据冲突和一致性

Meteor 通过一种称为乐观 UI (Optimistic UI) 的机制来确保流畅的用户体验。客户端在提交数据变更时,先立即更新 MiniMongo 中的数据,再通过 DDP 同步到服务器。如果服务器的验证或其他操作失败,客户端会收到回滚通知,将数据恢复为正确状态。

示例:

  1. 客户端提交数据时,先直接更新 MiniMongo。
  2. 服务器接收数据后进行验证。
  3. 如果验证成功,服务器更新 MongoDB,并将最终结果反馈给客户端。
  4. 如果失败,客户端恢复为原始状态。

实际应用场景

MiniMongo 的这种前后端数据同步机制特别适用于以下应用场景:

  • 聊天应用: 消息可以实时从服务器同步到所有用户的浏览器。
  • 项目管理工具: 任务和进度的更新可以即时传播到所有在线用户。
  • 实时协作工具: 如共享文档、在线表格,用户的修改实时反映给其他用户。

总结

Meteor 的 MiniMongo 提供了一个强大的客户端数据库,让开发者可以轻松处理本地数据,同时通过 Meteor 的 DDP 实现了前后端数据的自动同步。通过这种机制,开发者能够快速构建出响应式、实时更新的 Web 应用,而不必手动编写复杂的同步逻辑。这一特性使得 Meteor 特别适合那些需要频繁更新数据、实时响应用户操作的应用场景。

目前计划是先介绍minimongo,然后将一讲它的pub/sub,然后是rpc,再就是其架构,最后就是分布实现简易版的前端和后端。虽然初学很简单,想应用还是需要掌握不少知识的,不然可能遇到性能、安全问题-尤其是没看完官方所有教程的时候,我在想要不要出个翻译版本,想想还是算了,完全的一对一翻译不太适合我…


http://www.niftyadmin.cn/n/5688317.html

相关文章

GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。

目录 1,问: 1,答: 步骤概述 步骤 1:SPI 初始化 步骤 2:Flash 初始化(可选) 步骤 3:发送读取命令 示例:发送读取数据命令 步骤 4:读取数据…

第四章:信息系统架构(4.3应用架构-4.6网络架构)

4.3应用架构 根据业务架构规划目标应用域、应用组和目标应用组件,形成目标应用架构逻辑视图和系统视图 4.3.1 基本原则 常用的应用架构规划与设计的基本原则有:业务适配性原则、应用聚合化原则、功能专业化原则、风险最小化原则和资产复用化原则。 4.3.2 分层分…

消息中间件---初识(Kafka、RocketMQ、RabbitMQ、ActiveMQ、Redis)

1. 简介 消息中间件是一种支撑性软件系统,它在网络环境中为应用系统提供同步或异步、可靠的消息传输。消息中间件利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它支持多种通信协议和数据格式,…

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)

3 网络及IP规划 3.1 容器连接网络初步规划 规划所有容器与虚拟机的三张网卡以macvlan的方式进行连接(以后根据应用可以更改),在docker下创建nat、wifi、nei、wai四张网卡,他们和虚拟机及宿主机上NIC的相关连接参数如下表所示&am…

html5 + css3(上)

目录 HTML认知web标准vscode的简介和使用注释标题和段落换行和水平线标签文本格式化标签图片图片-基本使用图片-属性 绝对路径相对路径音频标签视频标签超链接 HTML基础列表列表-无序和有序列表-自定义 表格表格-使用表格-表格标题和表头单元格表格-结构标签(了解&a…

SAP 和 Carahsoft 的调查范围扩大到与近 100 家机构

美国司法部正在扩大对德国软件公司SAP和经销商Carahsoft的价格操纵调查,涉及近100个政府机构。这项调查最初集中在两家公司是否在2014年以来向美国国防部和其他政府部门收取过高费用,涉及金额超过20亿美元。最新的法院文件显示,调查范围已扩展…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端: 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

linux中bashrc和profile环境变量在Shell编程变量的传递作用

在 Linux 系统中,.bashrc文件和.profile文件都是用于配置用户环境的重要文件,它们之间有以下关联: 一、作用相似性 环境设置:两者都用于设置用户的环境变量和启动应用程序的配置。例如,它们可以定义路径变量&#xf…