节点和一般的MVC:模型如何与视图绑定?

我从node.js开始,并正在做一个简单的MVC框架。 到目前为止,我已经有了一个前端控制器(或“调度员”,如果你愿意的话)工作。 路由通过调度器configuration模块发生,如图所示。

我的问题是在代码之后的最后。 此外,这是一个学习节点的练习,请不要build议express.js等。

dispatcherConfig.js

var url = require('url'); (function() { var dispatcherConfig = { '/' : 'homeController', '/index.html' : 'homeController', '/sayHello.html' : 'helloController', '404' : '404Controller' }; module.exports.getController = function(request) { var route = url.parse(request.url, true).pathname; if(dispatcherConfig[route]) { return dispatcherConfig[route]; } return dispatcherConfig['404']; } }()); 

这是由dispatcher.js使用的:

 var dispatcherConfig = require('./config/dispatcherConfig'); (function() { module.exports.dispatch = function(request, response) { var requiredController = dispatcherConfig.getController(request); var controller = require('./controllers/' + requiredController); controller.doService(request, response); } }()); 

这里是什么样的控制器看起来像(作品丹迪也) – homeController.js
(现在请忽略内联视图代码)

 (function() { var homeController = { doService: function(request, response) { response.write('<form action="/sayHello.html" method="GET">' + '<input id="name" name="name" size="20" />' + '<input type="submit" value="Submit" />' + '</form>'); } } module.exports.doService = function(request, response) { return homeController.doService(request, response); } }()); 

这个路由很好地工作。 我有控制器很容易连接到url模式,并通过进一步检查请求对象来模拟spring的multiaction控制器types。

这里需要做的三件事是:

  1. 创build视图对象
  2. 创build模型对象
  3. 绑定视图和模型

问题

  1. 在MVC中(至less是spring),它是控制器与模型绑定的视图。 这是做这件事的最好方法吗? 如果我维护单独的一个单独的configuration,该configuration描述什么视图绑定到什么模型,并且控制器只路由到一个视图。 这是错的,而不是MVC?
  2. 在node.js中表示视图的好方法是什么? 由于它基于模板,所以提供了哪些模板选项(成熟的)?
  3. 如果我加载一个静态文件(比如说CSS文件,通过读入内存的文件加载),并且保持对全局/ app范围内容的引用,那么后续的请求可以直接从内存中提供,导致惊人的速度,这个假设是否正确? 事实上,我们可以保证,在第一个请求进入节点服务器(这将触发文件读取和内容被加载到mem)之后,所有后续请求将从内存(对于这样的静态内容)被提供。
  4. 抓取原始node.js中的POST数据的低级别(无框架)方法是什么?

谢谢。

要回答你的标题问题,我就是这样解释给我的:

控制器是路由器,它接收传入的请求,将它们与一些业务逻辑(包括获取数据)和一些渲染方法配对,然后将它们吐出队列。 把它看作是一个邮件分拣机或什么的:“这是一个地址,有一个箱子”。

这个观点应该是愚蠢的。 它应该采取数据并将其填入插槽,也许做一些表循环,也许包括一些其他的意见,但就是这样。 呈现HTML。 更好的是“呈现”XML或JSON输出的“视图”,或者仅仅是将原始数据返回给客户端。 (所有视图)

模型是一个棘手的部分,因为这是处理来自数据库的数据或来自数据库的结果。 所以这里可能会有很多“层”,而且实际上你可能会做很多的嵌套调用。 这是您要validation超出健全性检查之外的input的位置(并且在发生故障时将适当的载体消息返回给控制器)​​,这是在存储之前要进行预处理的位置,以及后处理从数据库中出来的数据。 这是逻辑生活的地方。

事情是这样的:我们不再单一地做事情,而是在打电话给我们打算发生的事情。 所以通过调用一个特定的控制器,你已经在语义上指定了一些信息(看看为什么他们称之为语义网,因为这个原因)。

所以我们可以让控制器变成笨手笨脚的(主叫方知道这个意图)。 我们可以负担得起模型dumber(它正在处理控制器的特定位业务逻辑和存储)。 而这个观点总是愚蠢的。

这并不是说一个单一的模型类不可能是相当大的。 但是单个控制器应该调用的部分应该是狭窄的。

为了您的其他要求:

在MVC中(至less是spring),它是控制器与模型绑定的视图。 这是做这件事的最好方法吗? 如果我维护单独的一个单独的configuration,该configuration描述什么视图绑定到什么模型,并且控制器只路由到一个视图。 这是错的,而不是MVC?

看上面,我想我已经覆盖了这个。 控制器被要求根据你的语义要求做某件事情。 控制器不是单片开关语句,因此不需要在其中进行大量的configuration。

在node.js中表示视图的好方法是什么? 由于它基于模板,所以提供了哪些模板选项(成熟的)?

“代表一个观点”? 嗯,视图引擎自己做匹配。 你真的想写自己的视图引擎? 可以办到。 标记一个视图文件,find“控制动词”(缺乏一个更好的名字,我敢肯定他们有一个),在那里插入数据,然后把整个标记结构作为一个string呈现出来(HTML本质上是一个string, ?)。 这就是我所得到的一切。 我的build议是,让观看人做视图工作,你不需要全部重写。

如果我加载一个静态文件(比如说CSS文件,通过读入内存的文件加载),并且保持对全局/ app范围内容的引用,那么后续的请求可以直接从内存中提供,导致惊人的速度,这个假设是否正确? 事实上,我们可以保证,在第一个请求进入节点服务器(这将触发文件读取和内容被加载到mem)之后,所有后续请求将从内存(对于这样的静态内容)被提供。

这是一个正确的假设。 这就是我要做的事情,用一般的垃圾收集程序来检查每隔几分钟,并且撕碎任何超过n分钟的文件,然后在随后的请求中重新加载,以确保获得相对较新的文件。 但是,这实际上是caching代理所做的,所以是的,这是完全可以接受的。

抓取原始node.js中的POST数据的低级别(无框架)方法是什么?

你没有。 节点为你做这个。 它已经出现在请求对象中了。

我见过的最常用的模板引擎是Jade和EJS,主要是因为Express内置了对它们的支持。 如果你不打算使用快递,我也会认真研究胡须(我个人更喜欢它的哲学Jade / EJS)。