Node.js /Express 和 mongoose:通过自动拉取新数据建立“可观察”的 mongodb 连接?

Posted

技术标签:

【中文标题】Node.js /Express 和 mongoose:通过自动拉取新数据建立“可观察”的 mongodb 连接?【英文标题】:Node.js /Express and mongoose: Make an "observable" mongodb Connection with automatic pull on new Data? 【发布时间】:2019-02-19 01:24:42 【问题描述】:

我正在使用 MEAN Stack,并且正在使用 mongoose 对我的 mongodb 数据库进行异步请求。我现在在 Angular 前端有一个图表,它显示了来自 mongodb 查询的一些数据。问题是,数据每 1 分钟更新一次,我想每 15 分钟自动拉取和刷新图表。 是否有可能在猫鼬中以自动方式反映这一点?或者人们通常如何意识到这一点?我认为有不同的方法:

1.我可以在 Angular 前端每 15 分钟执行一次 http 请求,但这可能不是很好的风格,正如我所听说的,http 请求是可观察的,可以为您的源 api 构建一个套接字流,是真的吗?

2.如果这些 observables 跟踪更改,那么在 mongodb 中使用 mongoose 跟踪新数据与前端之间仍然没有任何联系(前端对新数据一无所知,因为数据是从 API 发送的) .我可以尝试某种“推送”或使用计时器刷新,触发 api 请求并从后端每 1 分钟左右执行一次 api 函数,但我不知道该怎么做,因为 Promise 是一次性触发的而不是可观察的......也许这适用于回调?在 Node.js /Express 和 mongoose 中是如何做到的?

【问题讨论】:

【参考方案1】:

我相信最好的办法是从后端推送更改,而不是依赖轮询数据。

    当您订阅 observable 时,有角度的 HttpClient 只会进行 HTTP 调用。这导致只执行一个请求,因此没有您提到的套接字流。每 15 分钟左右轮询一次后端确实是不可取的,因为更优雅的解决方案是在更改发生时立即获取更改。

    我相信您应该研究 websockets (read more) 并在新数据准备好时从后端推送通知。这将允许您立即使用更改更新您的 UI。您可以使用 Socket.IO (docs) 并在每次更新数据库时发布一条新消息。 Socket.IO 比我发现的常规 websocket API 更容易实现,如果 websockets 不可用,它将回退到其他长轮询机制。 (在此 SO 线程中进一步解释:socket.io fallbacks。在 RxJs 中有一个专用的 observable,您可以使用它来订阅您的 websocket 流并接收通过您的 websocket 推送的新事件:RxJs Websockets。设置您自己的 observables 来订阅如果您选择这样做,那么您的 websocket 事件也很简单。

【讨论】:

以上是关于Node.js /Express 和 mongoose:通过自动拉取新数据建立“可观察”的 mongodb 连接?的主要内容,如果未能解决你的问题,请参考以下文章

Node js之Express初步介绍和安装

UnhandledPromiseRejectionWarning、Express.js 和 Node.js

开源 Node.js(和 Express)项目 [关闭]

使用 Node.js 和 Express 发布时如何访问请求正文?

Express 和 node.js 中的 HTML?

使用 node.js 和 express 的 JQuery Ajax 发布请求