【问题标题】:MVC / websockets in node.jsnode.js 中的 MVC / websockets
【发布时间】:2011-12-01 18:57:34
【问题描述】:

我正在考虑构建一些使用 websocket 的 Intranet 应用程序。我目前在服务器上为我的 Web 框架使用 Python/Pylons,并进行轮询以更新页面 DOM 中的项目。 Pylons 不太适合与 websockets(恕我直言)进行通信,因为它每个连接都使用一个线程。我正在考虑使用 node.js 作为服务器来与来自我的 Web 应用程序的 websocket 连接进行通信。这是我的应用程序的“10,000 英尺视图”:

  • Pylons 提供 Web 内容(html、css、图像、javascript 等)
  • 页面应用程序上的 JavasSript 向 node.js 服务器打开 websocket
  • node.js服务器通过websocket向应用推送数据
  • JavaScript 根据来自 websocket 的数据更新页面 DOM 元素

上面案例中的数据来自一个 MySQL 数据库,这就是我的问题的来源。我之前设置过 MVC 类型的应用程序,并且可以在 node.js 中做同样的事情。但是,如果我有一个向 node.js 服务器开放的长期 websocket,那么 node.js 如何知道模型中的更改并将它们推送到应用程序?例如,如果我想更新 web 应用程序页面上显示的总数,并且这些总数由于 node.js(其他 web 应用程序)之外的系统中的操作而发生变化,node.js 如何通知这些更改?想到的是让 node.js 轮询数据库以获取各种更改并将更改传播到各种视图。但对我来说,这听起来就像我正在将我的轮询从 Web 应用程序转移到 node.js 服务器?

有人对此有任何想法、建议或指示吗?

提前致谢! 道格

【问题讨论】:

  • 为什么 pylons 应用不能通知 node.js?
  • 可以,这就是我现在正在做的事情。 JavaScript 使用 AJAX/JSON 轮询 Pylons 应用程序以获取数据。但是,此方法通常会轮询未更改的数据。另外,我的应用在不同用户浏览器上运行的所有“实例”都在轮询数据。

标签: javascript model-view-controller node.js websocket pylons


【解决方案1】:

您可以:

  • 让 Python 脚本通知 node.js 应用程序(通过套接字或通过 HTTP)
  • 或者从 node.js 轮询,因为它不知道其环境之外的变化

轮询被认为是不好的,因为它无法扩展。当有一个轮询的进程确实可以扩展时,因为当另一个用户连接时它不需要更多的连接。所以基本上:

// query every second or so
setInterval(function () {
    // query database
    doSomeDatabaseStuff(function (res) {
        // check dirty
        if (res.changed) {
             // notify all clients
             allConnectedSockets.forEach(function (socket) {
                 socket.send({ msg: "update" });
             });
        }
    })
}, 1000);

这样,您就拥有一个轮询数据库的进程,以及一个可扩展的架构来通知您连接的客户端。仍然可以从任何来源填充数据库。

【讨论】:

  • 感谢您的反馈。在发布我最初的问题后,我有点在考虑这个问题;让 node.js 进行轮询意味着无论有多少客户端(Web 应用程序)连接到它,都只有它在进行轮询。我想我一直在寻找的一件事是应用程序/数据库的不同域如何设置“脏”位并以某种方式让 node.js 意识到这种变化。我想这可能是来自发送到 node.js 的“控制器”的更改通知,导致它更新其观察者,这可能会消除轮询。
  • 脏设置可以通过多种方式完成。您可以将数据写入数据库,如果 MAX(id) 高于上次,则可能发生了变化。或者您可以打开从 Python 到 node.js 的连接,这可以通过另一个套接字或普通 HTTP 来完成,并让 Python 通过这种方式通知应用程序。 node.js 应用程序可以通过通知其客户端来对此做出响应。
【解决方案2】:

Sails.js 是一个节点的 MVC 框架,它具有独特的区别,即以与 Express 路由相同的方式 RESTful 路由 Socket.io 消息。

Sails 目前使用 Sequelize,并且默认配置为使用 mySQL(但也支持 SQLite 和 Postgres)。我们正在切换到允许您选择自己的 ORM 的模型,这将使​​我们能够支持 JugglingDB(其中增加了对 Mongo 的支持)

它还捆绑了前端组件 Mast。 Mast 提供与 Meteor 类似的功能,因为它允许您直接从客户端与数据库对话。如果您需要提供更复杂的功能,只需在后端添加一个控制器即可。

更多:https://github.com/balderdashy/sails

【讨论】:

  • 感谢您的反馈,我会检查 Sails.js,看看它是否适合我。再次感谢!
  • 太棒了!如果您有反馈,请告诉我。我正在尝试将功能独立的部分提取到更小的模块中,以便人们可以使用对他们有用的部分(即我们只是将资产编译器取出并制作了一个单独的节点模块。)
猜你喜欢
  • 2015-04-10
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多