Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js中的MVC/WebSocket_Javascript_Model View Controller_Node.js_Websocket_Pylons - Fatal编程技术网

Javascript node.js中的MVC/WebSocket

Javascript node.js中的MVC/WebSocket,javascript,model-view-controller,node.js,websocket,pylons,Javascript,Model View Controller,Node.js,Websocket,Pylons,我正在考虑构建一些使用WebSocket的intranet应用程序。我目前正在服务器上为我的web框架使用Python/Pylons,并进行轮询以更新页面DOM中的项。挂架不适合与WebSocket(IMHO)通信,因为它在每个连接中使用一个线程。我正在考虑使用node.js作为服务器,与来自web应用程序的websocket连接进行通信。以下是我的应用程序的“10000英尺视图”: 挂架提供web内容(html、css、图像、javascript等) 页面应用程序上的JavasSript打开

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

  • 挂架提供web内容(html、css、图像、javascript等)
  • 页面应用程序上的JavasSript打开到node.js服务器的websocket
  • 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服务器

有人对此有什么想法、建议或建议吗

提前谢谢! 道格

你可以:

  • 让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);

通过这种方式,您可以使用一个进程轮询数据库,并使用一个可扩展的体系结构通知连接的客户端。数据库仍然可以从任何来源填充。

Sails.js是一个用于节点的MVC框架,其独特之处在于RESTfully路由Socket.io消息,其方式与Express路由相同

Sails目前使用Sequelize,默认情况下配置为使用mySQL(但也支持SQLite和Postgres)。我们正在切换到一个模型,允许您选择自己的ORM,这将允许我们支持JugglingDB(其中包括对Mongo的支持)

它还附带了一个前端组件,桅杆。Mast提供了与Meteor类似的功能,因为它允许您从客户机直接与数据库通信。如果需要提供更复杂的功能,只需在后端添加一个控制器


更多信息:

为什么pylons应用程序不能通知node.js?可以,这就是我现在正在做的。JavaScript使用AJAX/JSON轮询Pylons应用程序以获取数据。然而,这种方法通常是轮询未更改的数据。另外,我的应用程序在不同用户浏览器上运行的所有“实例”都在轮询数据。感谢您的反馈。在发布了我最初的问题后,我开始思考这个问题;让node.js进行轮询意味着无论有多少客户端(web应用程序)连接到它,只有它在进行轮询。我想我要寻找的是应用程序/数据库的不同域如何设置“脏”位,并以某种方式使node.js意识到这一变化。我想这可能是一个“控制器”发送到node.js的更改通知,它会更新其观察者,这可能会消除轮询。脏设置可以通过多种方式完成。您可以将数据写入数据库,如果MAX(id)高于上一次,则可能发生了变化。或者您可以打开从Python到node.js的连接,这可以通过另一个套接字或普通HTTP来完成,并让Python通过这种方式通知应用程序。node.js应用程序可以通过通知其客户端来响应此请求。感谢您的反馈,我将查看Sails.js,看看它是否适合我。再次感谢!令人惊叹的!如果您有反馈,请告诉我。我正试图将功能上独立的部分提取到更小的模块中,这样人们就可以使用适合自己的模块(即,我们刚刚取出资产编译器,制作了一个单独的节点模块)