如何正确处理聊天消息应用程序的“已读”-“未读”状态?

2024-06-28

我目前正在开发一个反应本机应用程序,该应用程序使用 socket.io 提供聊天室功能

我目前愿意处理消息的未读/已读状态,但我不知道该逻辑应位于何处:在客户端代码中还是在服务器端?

这是我的代码组件的基本实现

<ChatRoomCard /> //-> displays the last message and the chatroom title and 
                    can navigate to the ChatRoom component
<ChatRoom id={} />

我的 reduxState 是这样的:

{
  chatRooms: [{chatRoomId: '', title: ''}],
  chatRoomsMessages: {
           [chatRoomId]: [{messageId: '', text: ''}]
     }
}

每个组件都连接到 redux,ChatRoomCard 接收chatRoomsprops 包含对象数组“[{chatroomId: ''}]”,而 ChatRoom 组件仅接收相应的消息。

如果是在客户端,我的第一次尝试将是添加一个状态lastRead : timestamp对于每个 ChatRoomCard,每次安装 ChatRoom 组件时都会更新此状态,从而显示最后的消息。

因此,现在当套接字 io 事件“new msg”触发并且我收到新消息时,我可以在 ChatRoomCard 组件中映射将 message.createdAt 时间戳与 ChatRoomCard.lastReadTimestamp 进行比较的消息,并在每当message.timestamp 在lastReadTimestamp 之后。

这个解决方案听起来不错吗?或者这个逻辑属于后端?或者也许两者兼而有之?我有点失落,因为这是我第一次这样做

多谢


此类决策涉及不同目标之间的权衡,每种解决方案都有优点和缺点:

  • 如果您在前端执行此操作,则在服务器中使用的电量更少,因此扩展也更容易。
  • 如果不是一些复杂的计算,并且在前端进行,用户体验会得到改善,因为没有网络延迟。
  • 出于安全原因,如果信息具有某种程度的敏感数据,最好在服务器中进行任何状态更改,因为客户端可能受到某些黑客的攻击。
  • 如果要从许多用户或会话中再次使用该信息,最好的解决方案是将其存储在数据库中,因此计算将转到服务器并保存到数据库中。
  • 如果后端是无状态的,也许我需要从数据库中重新检索数据。前端可能已准备好使用之前请求的数据。

现在更具体地解决您的问题:

我们想要在组件中添加信息,因此数据肯定必须到达组件。必须有人计算这些信息。该组件只负责呈现和向用户提供什么,而不负责数据如何计算。所以该组件不会进行计算。

状态是链中的下一个环节,拥有计算该信息并将其提供给组件所需的信息。我认为这是最好的解决方案,因为您的数据不敏感或必须保存到数据库中。

最好的方法是使用react-redux.connect和mapStateToProps这样的函数。完整的示例和解释是here https://redux.js.org/docs/recipes/ComputingDerivedData.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确处理聊天消息应用程序的“已读”-“未读”状态? 的相关文章

  • 如何对页面的某个部分进行实时更新?

    我需要刷新页面的各个部分 以便在有新数据时进行更新 我该怎么办 使用jquery 例子 是的 jQuery 非常适合这个 查看这些方法 http api jquery com category ajax http api jquery co
  • 系统js语法错误,IE11

    我有一个 Angular 2 应用程序可以在 Firefox 和 Chrome 中工作 但在 IE 中却没有那么多工作 根据我的堆栈跟踪 我的 System js 设置似乎存在问题 这是我在网络控制台中看到的错误描述 Error Syste
  • 是的验证;同一字段可以接受不同类型吗?

    我对是的很陌生 我试图验证字段可以是遵循某个正则表达式的字符串 也可以是此类字符串的数组 这是检查字符串与我的正则表达式匹配的工作示例 field yup string matches regex 现在我想要field如果它有一个这样的字符
  • 将 Babel 与单个输出文件和 ES6 模块一起使用

    这是我的 gulp 任务 将 ES6 代码编译成单个 ES5 文件 我使用类和模块 import export 在 ES6 中 gulp src paths scripts pipe sourcemaps init pipe babel p
  • 递归process.nextTick警告

    作为我的应用程序的一部分 我有以下代码行 process nextTick function pre populate cache with all users console log scanning users table in ord
  • 按周将对象数组拆分为组

    我有一个包含这样的数据的对象数组 date 01 01 2017 00 00 00 dataField1 dataField2 date 01 02 2017 00 00 00 dataField1 dataField2 date 01 1
  • 如何在Javascript中保存zip文件的二进制数据?

    我从 AJAX 响应中收到以下响应 这是 zip 文件的响应 请让我知道如何在 Javascript 中保存此 filename zip ZIP 里面有 PDF 文件 我的代码是这样的 ajax url baseURLDownload se
  • Django 管理中的自定义依赖下拉菜单

    我有一个按阶段模型的项目外键 我很难在 Django 管理页面中创建依赖的下拉列表 我想当用户从该项目的 项目下拉 阶段选择一个项目时 在第二个下拉菜单中显示 实现这一目标的最佳方法是什么 如果下拉列表根据其父级的值来过滤项目 那就太好了
  • 链接index.html client.js 和 server.js

    我从 Node js 开始 我的第一个程序已经遇到了问题 下面是我正在使用的代码 索引 html
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • 未处理的 Promise 拒绝:push.on 不是函数

    我正在使用离子2 我得到这个打字稿error当尝试设置推送通知时 我从教程中复制了此示例代码 因此预计它可以工作 我一定有什么问题 任何想法请 Unhandled Promise rejection push on is not a fun
  • Bootstrap 多选限制问题

    我使用创建了一个多选下拉列表引导多选 http davidstutz github io bootstrap multiselect 我需要在选项选择中设置一个限制 这里我将其设置为 5 如果达到限制 我只需禁用其他选择选项 它就可以完美工
  • jQuery 分钟和秒倒计时器

    我想创建一个 jquery 倒计时器 我尝试了以下代码 但它不起作用 我该怎么办 DEMO https jsfiddle net tbosn210 https jsfiddle net tbosn210 var interval setIn
  • 未捕获的类型错误:无法分配给只读属性

    我正在尝试 Nicholas Zakas 所著的 Professional JavaScript for Web Developers 一书中的这个非常简单的示例 但我不知道我在这里做错了什么 我错过了一些非常简单的事情 但我被困住了 这是
  • React Native“hello world”快速启动:“无法连接到开发服务器”

    我正在尝试做本地反应 hello world 并且我在我的android上使用usb调试 I ran react native run android then react native start 我可以在中查看js文件localhost
  • 当 JavaScript 抛出异常时不要停止它

    我正在使用 JavaScript 编写一个 Windows 边栏小工具 现在我想捕获所有 JavaScript 异常并将其记录到文本文件中 一个问题是 当任何一行抛出异常时 下一行将不会被执行 是否可以自动捕获异常 以便执行以下 JavaS
  • 如何捕获 google 地图的无效 API 密钥

    我有这个代码 如果密钥无效 则会弹出警报 但我想在这种情况下执行一些操作 但我不知道如何连接它 有任何想法吗 Google 不提供检查 Google 地图 API 密钥的外部方法 因此 您无法使用例如查询某些服务 此代码有效吗abcde12
  • 如何防止外部 CSS 添加和覆盖 ReactJS 组件样式

    我有一个自定义的 ReactJS 组件 我想以某种方式设置样式 并将其作为插件提供给许多不同的网站 但是 当网站使用全局样式 Twitter bootstrap 或其他 css 框架 时 它会添加并覆盖我的组件的样式 例如 全局 css l
  • 如何将 JSLint 用于依赖于 JQuery 的代码段?

    我对 Javascript 比较陌生 我想通过 JSLint 运行我周末玩的那段代码 这样它就可以指出我在哪里是个十足的白痴 不幸的是 我收到了大量关于缺少函数声明的错误 这些函数声明是 JQuery javascript 库及其各种插件的
  • 将画布下载为 PNG 图像[重复]

    这个问题在这里已经有答案了 当我尝试将画布下载为 PNG 图像时 浏览器会在新页面中打开该图像 但不下载它 我的下载代码 btnScaricaEtichetta click function console log Download loc

随机推荐

  • tkinter.mainloop 函数的 n 参数是什么?

    A n参数可以被赋予tkinter mainloop功能 help tkinter Tk mainloop gt gt gt gt mainloop self n 0 What is n here Call the mainloop of
  • 无法打开项目...无法打开,因为无法解析项目文件

    我已经工作了一段时间来创建 iPhone 应用程序 今天 当我的电池电量不足时 我正在工作并不断保存我的源文件 然后电源就断了 现在 当我重新插入计算机并且电源正常时 我尝试打开我的项目文件 但出现错误 无法打开项目 项目 无法打开 因为无
  • Cython、CMake和setup.py、python在一个子目录下编译两次

    我正在尝试按照以下结构与 Cython 绑定一起构建 C 库https bloerg net 2012 11 10 cmake and distutils html https bloerg net 2012 11 10 cmake and
  • 在 BASH 中按字节读取文件

    我需要读取指定文件的第一个字节 然后读取第二个字节 第三个字节 依此类推 我怎样才能在 BASH 上做到这一点 P S 我需要获取这个字节的十六进制 完全重写 2019 年 9 月 比以前的版本更短更简单 速度更快 但没那么快 Yes ba
  • Numpy 矩阵到 tkinter 画布

    如何将 Numpy 矩阵作为位图显示到 Tkinter 画布中 更准确地说 如何填写PhotoImage来自矩阵的内容 photo ImageTk PhotoImage self canvas create image 0 0 image
  • 改变了 (un)serialize() 的行为?

    编辑 问题是现在已记录的 php 错误 https bugs php net bug php id 71617 https bugs php net bug php id 71617感谢您找到那个 Danack 我刚刚将应用程序从 PHPH
  • Shapeless 中 TypeClass 特征的 emptyCoproduct 和 coproduct 方法的用途是什么

    我并不完全清楚这样做的目的是什么emptyCoProduct and coproduct的方法TypeClass无形中的特质 什么时候会使用TypeClass特质而不是ProductTypeClass 这两种方法的实施方式有哪些示例 假设我
  • 使用php从图像中获取第一个像素

    我正在尝试获取图像的第一个像素 最好是最左上角或最右上角的一个像素 我看到了这个问题 它有最接近我的问题的答案 获取图像颜色 https stackoverflow com questions 1746530 get image color
  • 在 AngularJs 中设置动态作用域变量 -scope.

    我有一根绳子 是从routeParam或指令属性或其他什么 我想基于此在范围上创建一个变量 所以 scope
  • 如何使用Caliper进行基准测试?

    我试图弄清楚如何使用 Caliper 在 Eclipse 中进行基准测试 但一无所获 我尝试按照此处找到的 26 分钟教程进行操作 https code google com p caliper https code google com
  • 表示区间或范围? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 一般来说 每当您表示任何类型的范围时 您都可以选择为范围的开始和结束选择哪些类型的值 例如 如果您想要一个包含整数 1 2 3 4 5 的范围
  • 如何读取Flask函数中隐藏的表单数据[重复]

    这个问题在这里已经有答案了 我正在为 Flask 应用程序做一个作业 该应用程序的函数根据 index html 页面上表单中隐藏字段的值执行不同的操作 我只有两条路线 index html 和 process 对index html执行操
  • 如何使用javascript将div从左向右移动

    I have div named movingImage每次单击按钮时我都想向右移动 50px 这是我的 JavaScript function moving Image document getElementById movingImag
  • 为什么 Xcode 会在钥匙串中自动安装(重复且过期的)证书? [复制]

    这个问题在这里已经有答案了 可能的重复 xCode 4 重新安装我删除的钥匙串证书 https stackoverflow com questions 5264481 xcode 4 reinstalls keychain certs th
  • MATLAB:检测并删除 2 列矩阵中的镜像对

    我有一个矩阵 1 2 3 6 7 1 2 1 并想删除镜像对 即输出将是 1 2 3 6 7 1 or 3 6 7 1 2 1 有没有一种简单的方法可以做到这一点 我可以想象一个复杂的 for 循环 例如 或不会删除原始对的版本 仅删除重复
  • swift - 仅在落地时跳跃

    我希望限制我的角色 猫 使其仅在地面 虚拟 SKNode 或树上 treeP SKNode 时跳跃 目前我没有任何限制touchesBegan因此 如果用户快速连续点击 猫就能够在空中飞翔 虽然这在其他游戏中可能很有用 但在这里不受欢迎 如
  • 如何处理 Volley StringRequest 中的空值

    我有一个返回 2 组不同值的响应 在每种情况下 都会有一个值always为空 另一个将为空always包含一个值 问题是 Volley 不允许我分配 null JSON 值或在 if 语句中检查 JSON 值 它只是指 catch 块 我正
  • Chrome getUserMedia 未在本地请求权限

    我正在尝试在 Chrome 中使用 navigator getUserMedia 但是 它在本地提供时不会请求权限 file whatever index html 但在 JSFiddle 上会请求权限 http jsfiddle net
  • flex 4 tabbar - 禁用选项卡

    有没有一种常见的方法可以在 Flex 4 中禁用 Spark TabBar 组件的选项卡 使用 mx tabnavigator 组件 您可以禁用与选项卡相对应的内容 然后选项卡也会被禁用 但是使用 Spark 选项卡栏组件执行此操作只会禁用
  • 如何正确处理聊天消息应用程序的“已读”-“未读”状态?

    我目前正在开发一个反应本机应用程序 该应用程序使用 socket io 提供聊天室功能 我目前愿意处理消息的未读 已读状态 但我不知道该逻辑应位于何处 在客户端代码中还是在服务器端 这是我的代码组件的基本实现