前端的混合全栈之路Meteor篇(三):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
Meteor 3.0 是一个功能强大的全栈 JavaScript 框架,特别适合实时应用程序的开发。它的核心机制之一就包括发布-订阅(Publish-Subscribe)模型,它允许服务器端发布数据,客户端订阅并实时更新。本文将介绍如何在 Meteor 3.0 中使用 publish-subscribe,包括简单发布、自定义发布,以及客户端的订阅和数据读取流程。
1. 服务器端:publish
数据源
1.1 简单发布(返回 cursor
或 cursor[]
)
在服务器端,发布数据非常简单。首先,你可以通过 Meteor.publish
来定义一个数据发布函数,该函数通常返回一个 MongoDB 集合的查询游标(cursor)。这个游标代表服务器向客户端发布的数据集。以发布一个简单的 Posts
集合为例:
// posts.js (服务器端代码)
import { Meteor } from 'meteor/meteor';
import { Posts } from '/imports/api/posts.js';Meteor.publish('allPosts', function () {// 返回一个 cursor 对象,客户端可以订阅该发布源return Posts.find();
});
上面的代码会将 Posts
集合中的所有数据发布到客户端。客户端订阅后会自动接收到这些数据。
你也可以返回一个数组,其中包含多个游标。例如:
Meteor.publish('multipleCollections', function () {return [Posts.find(),Comments.find(),];
});
这种方式适合在一次发布中返回来自多个集合的数据。
1.2 自定义发布(使用 added
/ changed
/ removed
/ stop
方法)
有时候你可能需要更灵活的控制,像控制数据发布的具体时机或内容。这时你可以使用 added
、changed
、removed
以及 stop
方法来手动管理数据的发布。
自定义发布的典型例子是只发布部分数据,或者根据某些复杂的逻辑来动态发布。如下示例,发布一个用户拥有的所有 Tasks
集合中的任务:
// tasks.js (服务器端代码)
import { Meteor } from 'meteor/meteor';
import { Tasks } from '/imports/api/tasks.js';Meteor.publish('userTasks', function () {const self = this;const userId = self.userId;if (!userId) {self.ready();return;}
// meteor的minimongo的find返回一个cursor,是可观察的;
// 除了数据集合,最常用的还包括订阅redis或者mq的数据const handle = Tasks.find({ owner: userId }).observeChanges({added(id, fields) {// 这个tasks就是发布到前端哪个数据集合self.added('tasks', id, fields);},changed(id, fields) {self.changed('tasks', id, fields);},removed(id) {self.removed('tasks', id);},});self.ready();self.onStop(function () {handle.stop();});
});
在此示例中,使用 observeChanges
来监听数据库的变化并调用 added
、changed
和 removed
,从而手动控制数据的发布。
2. 客户端:subscribe
订阅并读取数据
2.1 订阅与传参
在客户端,你可以使用 Meteor.subscribe
来订阅服务器端的发布源。对于简单的发布,订阅不需要任何参数;但对于自定义发布,你可以传递一些参数来过滤数据。例如,订阅上文中的 allPosts
数据源:
// client.js (客户端代码)
Meteor.subscribe('allPosts');
对于带参数的订阅,如根据用户 ID 来订阅特定用户的任务:
Meteor.subscribe('userTasks');
在订阅时还可以传递动态参数,例如只订阅特定状态的任务:
Meteor.subscribe('userTasks', { status: 'completed' });
2.2 从 MiniMongo 中读取数据并实时更新
在客户端订阅成功后,数据会被同步到客户端的 MiniMongo 数据库中。你可以使用 Mongo.Collection#find()
方法来从 MiniMongo 中检索数据。
// client.js (客户端代码)
import { Posts } from '/imports/api/posts.js';Tracker.autorun(() => {const postsCursor = Posts.find();postsCursor.forEach(post => {console.log(post);});
});
通过 Tracker.autorun
包裹查询,你可以确保每当数据发生变化时,UI 自动重新渲染。例如,你可以将其绑定到一个模板或 React 组件中,实时显示更新的数据。
3. 使用 mapCursor
将 MiniMongo 的 cursor
转化为 Vue 3 响应式数组
在 Meteor 3.0 中,使用 autorun
可以自动跟踪数据的变化。而在 Vue 3 中,响应式系统是通过 reactive
实现的。为了在 Vue 3 的 setup
函数中使用 Meteor 的数据订阅,我们可以定义一个方法 mapCursor
,将 Meteor 的 MiniMongo 游标(cursor)转化为 Vue 3 的响应式数组。
3.1 方法设计
我们将定义一个名为 mapCursor
的函数,它接收一个 Meteor 的 cursor
,例如 Tasks.find({})
,然后利用 Tracker.autorun
来监听游标变化。每当游标中的数据发生变化时,我们将更新 Vue 3 的 reactive
数组。并且,这个方法适合在 Vue 3 的 setup
函数中使用,能够在组件卸载时自动停止 autorun
。
3.2 代码实现
import { reactive, onUnmounted } from 'vue';
import { Tracker } from 'meteor/tracker';export function mapCursor(cursor) {// 创建一个响应式数组const reactiveArray = reactive([]);// 使用 autorun 监控 cursor 的变化const computation = Tracker.autorun(() => {// 获取游标中的数据const data = cursor.fetch();// 清空 reactiveArray 并用新的数据替换reactiveArray.length = 0; // 清空数组data.forEach(item => {reactiveArray.push(item); // 添加新的数据});});// 使用 onUnmounted 确保组件卸载时停止 autorunonUnmounted(() => {computation.stop();});// 返回响应式数组return reactiveArray;
}
3.3 方法说明
-
reactiveArray
: 使用 Vue 3 的reactive
方法创建一个响应式数组,用来存储cursor
的数据。 -
Tracker.autorun
: 用于监控cursor
的变化。每当 MiniMongo 中的数据发生变化时,它会自动运行,将最新的数据同步到reactiveArray
中。 -
清空并重新填充数组: 当游标中的数据发生变化时,我们先清空
reactiveArray
,然后用新的数据重新填充它。 -
onUnmounted
: 确保当组件卸载时停止autorun
监控,避免内存泄漏。 -
返回值: 返回的是一个 Vue 3 的响应式数组,这个数组会随着 MiniMongo 中数据的变化而自动更新。
3.4 在 Vue 3 中使用 mapCursor
该方法设计为在 Vue 3 的 setup
函数中使用,下面是如何在组件中使用这个方法的示例:
<template><div><h2>任务列表</h2><ul><li v-for="task in tasks" :key="task._id">{{ task.name }}</li></ul></div>
</template><script setup>
import { Tasks } from '/imports/api/tasks.js';
import { mapCursor } from '/imports/utils/mapCursor.js';// 订阅 Tasks 数据
const tasks = mapCursor(Tasks.find({}));
</script>
总结
Meteor 3.0 的发布-订阅模型使得开发实时应用非常高效。服务器端可以通过简单发布或自定义发布来灵活地控制数据的发布,客户端则可以通过订阅获取数据,并通过 Tracker.autorun
等机制实现自动化的 UI 更新。这种架构能够确保客户端总是与服务器端的数据保持同步,不需要定时或者在某个时机去获取最新数据。
写了这么几个章节,我发现自己忽略了一个开发环境的搭建章节,后续某个时间点再补上…先以其简单性吸引点人气,后期项目实战之前再介绍环境准备,其实也很简单
相关文章:
前端的混合全栈之路Meteor篇(三):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
Meteor 3.0 是一个功能强大的全栈 JavaScript 框架,特别适合实时应用程序的开发。它的核心机制之一就包括发布-订阅(Publish-Subscribe)模型,它允许服务器端发布数据,客户端订阅并实时更新。本文将介绍如何在 Meteor 3…...

自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

Webstorm 中对 Node.js 后端项目进行断点调试
首先,肯定需要有一个启动服务器的命令脚本。 然后,写一个 debug 的配置: 然后,debug 模式 启动项目和 启动调试服务: 最后,发送请求,即可调试: 这几个关键按钮含义: 重启…...

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐
目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择,因为它不仅具有现代前端框架的所有优点,还能让你专注于构建高性能、高可用性的W…...

一、Spring Boot集成Spring Security之自动装配
Spring Boot集成Spring Security之自动装配介绍 一、实现功能及软件版本说明二、创建Spring Boot项目三、查看自动装配配置类四、自动装配配置类之SecurityAutoConfiguration1、SecurityAutoConfiguration部分源码2、主要作用3、SpringBootWebSecurityConfiguration3.1、Spring…...
计数相关的题 Python 力扣
2284. 最多单词数的发件人 给你一个聊天记录,共包含 n 条信息。给你两个字符串数组 messages 和 senders ,其中 messages[i] 是 senders[i] 发出的一条 信息 。 一条 信息 是若干用单个空格连接的 单词 ,信息开头和结尾不会有多余空格。发件…...
Express内置的中间件(express.json和express.urlencoded)格式的请求体数据
目录 Express内置的中间件 express.json 中间件的使用 express.urlencoded 中间件的使用 express.urlencoded([options]) 解析req.body的兼容写法 Express内置的中间件 自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 …...
cmakelist加载Qt模块
Qt编程中,cmakelist会自动添加Core,Gui,Widgets模块,有时需要添加新的Qt的模块。在命令find_package中搜索要新增的模块,在命令target_link_libraries中添加要新增的模块。 比如要使用QUiLoader类,要增加对…...
8-2.Android 任务之 CountDownTimer 编码模板(开启计时器、取消计时器)
一、CountDownTimer 1、概述 CountDownTimer 是 Android 中一个用于执行定时操作的类 CountDownTimer 主要应用于在指定时间段内完成某项任务,或者每隔一段时间触发某项任务 2、使用步骤 创建 CountDownTimer:创建 CountDownTimer 就是创建它的匿名…...

Servlet的生命周期及用户提交表单页面的实现(实验报告)
一、实验目的、要求 1. 掌握Servlet的定义,即Servlet是运行在服务器端的Java程序,用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具,如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识,实验…...
【Router】路由功能之IP过滤(IP Filter)功能(基于端口)介绍及实现
IP过滤(IP Filter) IP Filter是一种通过对网络数据包中的 IP 地址进行分析和筛选,以实现对网络流量的控制和管理的技术。 IP过滤(IP Filter)作用 安全防护 可以阻止来自特定 IP 地址或 IP 地址范围的恶意攻击、非法访问等,增强网络的安全性。 流量管理 根据不同的 IP …...

数据结构_2.2、顺序表插入删除查找
1、线性表的顺序存储表示定义: 线性表:是具有相同数据类型的n (n≥0)个数据元素的有限序列 顺序表:用顺序存储的方式实现线性表 顺序存储:把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中&#…...

嵌入式C语言自我修养:编译链接
源文件生成可执行文件的过程? 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序,包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…...

Mac制作Linux操作系统启动盘
前期准备 一个 Mac 电脑 一个 U 盘(8GB 以上) 下载好 Linux 系统镜像(iso 文件) 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘,打开终端输入下面的命令查看 U 盘是否已经 m…...
PHP语言发展历程
PHP是一种开源的服务器端脚本语言,主要用于Web开发,最初由Rasmus Lerdorf在1994年创建。PHP的发展历程如下: PHP的起源:1994年,Rasmus Lerdorf创建了PHP的第一个版本,最初是一套用于跟踪他个人简历访问的C…...

Notepad++ 之 AndroidLogger插件
背景 最近一段时间在分析Android log 定位问题,Notepad 之前用的比较少,现在看log觉得确实好用,美中不足的是 看Android log的时候不像 logcat -v color 可以区分不同等级的颜色,于是调研了一下,发现大部分都是使用An…...

开源2+1链动模式AI智能名片O2O商城小程序源码:线下店立体连接的超强助力器
摘要:本文将为您揭示线下店立体连接的重大意义,您知道吗?线上越火,线下就得越深入经营。现代门店可不再只是卖东西的地儿,还得连接KOC呢!咱们来看看门店要做的那些超重要的事儿,还有开源21链动模…...

我为什么决定关闭ChatGPT的记忆功能?
你好,我是三桥君 几个月前,ChatGPT宣布即将推出一项名为“记忆功能”的新特性,英文名叫memory。 这个功能听起来相当吸引人,宣传口号是让GPT更加了解用户,仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…...

如何使用ssm实现中学生课后服务的信息管理与推荐+vue
TOC ssm766中学生课后服务的信息管理与推荐vue 第一章 绪论 1.1 选题背景 目前整个社会发展的速度,严重依赖于互联网,如果没有了互联网的存在,市场可能会一蹶不振,严重影响经济的发展水平,影响人们的生活质量。计算…...
【分别为微服务云原生】9分钟ActiveMQ延时消息队列:定时任务的革命与Quartz的较量
ActiveMQ延时消息队列:定时任务的革命与Quartz的较量 摘要: 在现代的消息驱动架构中,ActiveMQ的延迟消息队列功能为定时任务提供了一种新的解决方案。本文将详细介绍ActiveMQ延迟消息队列的功能、应用场景,并与Quartz定时任务进行…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...