Javascript 节点和常规中的MVC:模型如何绑定到视图?

Javascript 节点和常规中的MVC:模型如何绑定到视图?,javascript,model-view-controller,node.js,Javascript,Model View Controller,Node.js,我从node.js开始,制作一个简单的MVC框架。到目前为止,我已经有一个前端控制器(或“调度器”,如果你愿意的话)在工作。路由通过dispatcher配置模块进行,如图所示 我的问题在最后,紧跟着代码。另外,这是学习使用node的练习,请不要建议使用express.js之类的工具 dispatcherConfig.js: var url = require('url'); (function() { var dispatcherConfig = { '/'

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

我的问题在最后,紧跟着代码。另外,这是学习使用node的练习,请不要建议使用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'];
    }
}());
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);
    }
}());

这由dispatcher.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'];
    }
}());
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:
(请暂时忽略内联视图代码)

(函数(){
var homeController={
doService:功能(请求、响应){
响应。写入(“”+
'' + 
'' + 
'');
}
}
module.exports.doService=函数(请求、响应){
返回homeController.doService(请求、响应);
}
}());

这个路由工作得很好。我已经让控制器很容易地连接到url模式,并且通过进一步检查请求对象来模拟spring的多动作控制器类型

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

  • 创建视图对象
  • 创建模型对象
  • 绑定视图和模型

  • 问题

    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'];
        }
    }());
    
    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);
        }
    }());
    
  • 在MVC(至少是spring)中,是控制器将视图与 模型这是最好的方法吗?如果我保持独立呢 一个单独的配置,描述什么视图绑定到什么 模型,并且控制器仅路由到视图。这是错误的吗 不是MVC?

  • 在node.js中表示视图的好方法是什么?既然是 高度基于模板,提供哪些模板选项 (到期的)?

  • 如果我加载一个静态提供服务的文件(比如CSS文件,loaded 通过文件读入内存),我保留了对 全局/应用程序范围中的内容,然后可以删除后续请求 直接从记忆中获得服务,产生惊人的速度,是吗 假设正确吗?事实上,我们可以保证在第一次 请求进入节点服务器(将触发文件读取 以及加载到mem中的内容),所有后续请求 将从内存中提供(对于此类静态内容)。

  • 在中获取POST数据的低级(无框架)方式是什么 raw node.js
  • 谢谢。

    为了回答您的标题问题,我向您解释如下: 控制器是路由器,它接收传入的请求,将它们与一些业务逻辑(包括获取数据)和一些呈现方法配对,然后将它们吐出队列。把它想象成一个邮件分拣机或什么的:“这里有一个地址,那里有一个垃圾箱”

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

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

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

    因此,我们可以让控制器更笨(调用者知道意图)。我们可以让模型更简单(它为控制器处理特定的业务逻辑和存储)。而且这种观点总是愚蠢的

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

    对于您的其他请求: 在MVC(至少是spring)中,是控制器将视图与模型绑定在一起。这是最好的方法吗?如果我维护一个单独的配置,描述什么视图绑定到什么模型,并且控制器只路由到一个视图,该怎么办。这是错误的,不是MVC吗

    看上面,我想我已经讲过了。控制器被要求根据您的语义要求执行特定的操作。控制器不是单片开关语句,因此不需要在其中进行大量配置

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

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

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