4

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

我的问题在最后,紧跟在代码之后。另外,这是一个学习node的练习,请不要推荐express.js之类的。

调度程序配置.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 的多动作控制器类型。

这里需要做的三个明显的事情是:

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


问题

  1. 在 MVC(至少是 spring)中,控制器将视图与模型绑定。这是最好的方法吗?如果我单独维护一个单独的配置来描述什么视图绑定到什么模型,并且控制器只路由到一个视图。这是错误的而不是 MVC 吗?

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

  3. 如果我加载一个要静态服务的文件(比如 CSS 文件,通过文件读入内存加载),并且我在 global/app 范围内保留对内容的引用,那么后续请求可以直接从内存中提供,从而产生惊人的结果速度,这个假设正确吗?事实上,我们可以保证在第一个请求进入节点服务器后(这会触发文件读取和内容被加载到 mem 中),所有后续请求都将从内存中服务(对于此类静态内容)。

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

谢谢。

4

2 回答 2

9

为了回答您的标题问题,这就是我向我解释的方式:

控制器是路由器,它接收传入的请求,将它们与一些业务逻辑(包括获取数据)和一些渲染方法配对,然后将它们吐回队列。把它想象成一个邮件分拣机或其他东西:“这是一个地址,有一个垃圾箱”。

观点应该是愚蠢的。它应该获取数据并将其填充到插槽中,并且可能为表执行一些循环,并且可能包含一些其他视图,但仅此而已。呈现 HTML。更好的是“呈现” XML 或 JSON 输出的“视图”,或者只是将原始数据返回给客户端。(所有观点)

模型是棘手的部分,因为这是您处理传入的数据或来自数据库的结果的地方。所以这里可能有很多“层”,你实际上可能会进行很多嵌套调用。这是您要验证完整性检查之外的输入(并在故障时将适当的运营商消息返回给控制器)​​的地方,这是您要在存储之前进行预处理的地方,并对来自数据库的内容进行后处理。这就是逻辑存在的地方。

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

所以我们可以让控制器变得更笨(调用者知道意图)。我们可以让模型变得更笨(它为控制器处理特定的业务逻辑和存储)。观点总是愚蠢的。

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

对于您的其他要求:

在 MVC(至少是 spring)中,控制器将视图与模型绑定。这是最好的方法吗?如果我单独维护一个单独的配置来描述什么视图绑定到什么模型,并且控制器只路由到一个视图。这是错误的而不是 MVC 吗?

见上文,我想我已经涵盖了这一点。要求控制器根据您的语义要求做某件事。控制器不是单一的 switch 语句,因此不需要在其中进行大量配置。

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

“代表一种观点”?嗯,视图引擎自己进行匹配。您真的要编写自己的视图引擎吗?可以办到。标记一个视图文件,找到“控制动词”(因为没有更好的名称,我相信他们有一个),在那里插入数据,然后将整个标记化结构呈现为字符串(HTML 本质上是一个字符串,不?)。简而言之,这就是我所得到的。我的建议是,让视图人做视图工作,你不需要全部重写。

如果我加载一个要静态服务的文件(比如 CSS 文件,通过文件读入内存加载),并且我在 global/app 范围内保留对内容的引用,那么后续请求可以直接从内存中提供,从而产生惊人的结果速度,这个假设正确吗?事实上,我们可以保证在第一个请求进入节点服务器后(这会触发文件读取和内容被加载到 mem 中),所有后续请求都将从内存中服务(对于此类静态内容)。

这是一个正确的假设。这就是我要做的,使用一般的垃圾收集例程每隔几分钟检查一次并粉碎任何早于 n 分钟的文件,然后在后续请求中重新加载,确保您获得相对较新的文件。但这实际上是缓存代理所做的,所以是的,这是完全可以接受的。

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

你没有。Node 会为你做这件事。它已经出现在请求对象中。

于 2012-06-16T06:34:52.027 回答
0

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

于 2012-06-17T12:59:48.093 回答