当节点后端(MongoDB)中的状态发生变化时通知 Angular 前端

Posted

技术标签:

【中文标题】当节点后端(MongoDB)中的状态发生变化时通知 Angular 前端【英文标题】:Inform Angular frontend when state in Node backend (MongoDB) changes 【发布时间】:2019-01-03 04:24:51 【问题描述】:

当 MongoDB 中的状态发生变化时,我想实时更新 Angular 前端。我的选择是什么?除了例如,还有其他方法吗?使用socket.io?

场景 - 用户创建提醒,设置电子邮件到达邮箱的日期。现在,对于添加和删除提醒,我可以在前端模拟实时,因为我知道用户何时调用导致状态更改的某些操作,但我在每个提醒旁边都有一个文本 - “电子邮件已发送”或“电子邮件尚未发送”。因为我使用 cron 作业在我的后端发送电子邮件,所以前端无法知道它。

这是我编写后端代码的第一个项目,所以我只是想知道除了实现大量冗余内容以使一个小功能正常工作之外,还有其他方法吗?

NodeJs + Express + Angular6 + MongoDB

【问题讨论】:

socket.io 确实是从后向前发送消息的一致解决方案。你真的应该考虑一下。 @jbrtmd,是的,它在我的雷达之内,但现在我只有一个小功能要实现,所以需要寻找其他方法,如果有的话 您还可以每 X 秒/分钟/小时创建一个 AJAX 调用来检查提醒状态(根据您的 cron 作业)。使用此解决方案,您可以摆脱 socket.io,但它不会是实时的。 【参考方案1】:

查看Change Streams MongoDB 3.6 最新最酷的功能,以访问数据库中的实时更改。

示例 Node.js 代码

const collection = db.collection('example');
const changeStream = collection.watch();
const next = await changeStream.next();

【讨论】:

听起来是这里的最佳选择!我只需要检查是否可以通过 Mongoose 完成。谢谢! 这不只是后端进程吗?你如何通知你的前端? 为此目的使用套接字。 先生,如果没有这项技术,就无法通知前端服务器上检测到的数据库更改。【参考方案2】:

您可以使用 Angular 和 rxjs 实现轮询服务。该服务将在特定时间间隔检查您的数据库。

this.subscription = Observable.interval(1000).startWith(1)
.mergeMap(() => this.statusService.getStatus())
.subscribe((next) => 
 this.state = next;
 )

您可以使用rxjs interval operator 进行投票

【讨论】:

是的,我担心这样的事情是唯一的选择。好的,我等着看有没有人提出别的建议

以上是关于当节点后端(MongoDB)中的状态发生变化时通知 Angular 前端的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Vue.js--变化侦测

状态对象发生变化时更新上下文

当 sql server 数据库中的数据发生变化时,从一个 android 应用程序向另一个应用程序发送推送通知

当视图模型中的状态发生变化时,为啥路由的 Composable 会重新组合?

WatcherZK状态事件类型 ,权限

当提供者组件父状态发生变化时,为啥不能更新子组件中的值(带有反应上下文)?