Node 和 General 中的 MVC:模型如何与视图绑定?

2024-05-10

我从 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'];
    }
}());


这是由调度程序.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. 绑定视图和模型

Questions:
  1. 在 MVC 中(至少是 spring),控制器将视图与 模型。这是最好的方法吗?如果我保持分离怎么办 一个单独的配置,描述什么视图绑定到什么 模型,控制器仅路由到视图。这是错误的吗? 不是MVC?

  2. 在 Node.js 中表示视图的好方法是什么?因为它是 很大程度上基于模板,提供哪些模板选项 (成熟的)?

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

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

Thanks.


为了回答你的标题问题,我是这样向我解释的:

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

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

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

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

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

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

对于您的其他要求:

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node 和 General 中的 MVC:模型如何与视图绑定? 的相关文章

随机推荐