4 javascript model-view-controller node.js
我从node.js开始,正在创建一个简单的MVC框架.到目前为止,我有一个前端控制器(或"调度员",如果你愿意的话)工作.路由通过调度程序配置模块进行,如图所示.
我的问题是在代码之后的最后.另外,这是学习节点的练习,请不要建议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'];
}
}());
Run Code Online (Sandbox Code Playgroud)
这由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);
}
}());
Run Code Online (Sandbox Code Playgroud)
以下是示例控制器的样子(也适用于花花公子) - 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);
}
}());
Run Code Online (Sandbox Code Playgroud)
这种路由很好地工作.我已经让控制器很容易连接到url模式,并通过进一步检查请求对象来模拟spring的多操作控制器类型.
这里需要做的三个显而易见的事情是:
谢谢.
控制器是路由器,它接收传入的请求,将它们与一些业务逻辑(包括获取数据)和一些渲染方法配对,然后将它们从队列中吐出.把它想象成邮件分拣机或者其他东西:"这是一个地址,有一个垃圾箱".
这个观点应该是愚蠢的.它应该采用数据并将其填充到插槽中,并且可能为表执行一些循环,并且可能包含一些其他视图,但这就是它.渲染HTML.更好的是"渲染"XML或JSON输出的"视图",或者只是原始数据返回给客户端.(所有观点)
模型是棘手的部分,因为这是您处理数据的地方,或来自数据库的结果.所以这里可能有很多"层",你实际上可能会做很多嵌套调用.在这里,您将验证超出完整性检查的输入(并在故障时将适当的载体消息返回到控制器),这是您在存储之前预处理的地方,并对数据库中的内容进行后处理.这就是逻辑的存在.
事情就是这样:我们不再采取单一的做法,我们正在呼唤我们打算发生的事情.因此,通过调用特定的控制器,您已经在语义上指定了一些信息(因此,请参阅为什么将它们称为语义Web).
所以我们可以负担得起控制器号码(调用者知道意图).我们可以负担得起模型数量(它为控制器处理特定的业务逻辑和存储).这种观点总是愚蠢的.
这并不是说单个模型类不能很大.但是单个控制器应该调用的部分应该是狭窄的.
在MVC(至少是spring)中,它是将视图与模型绑定的控制器.这是最好的方式吗?如果我单独配置一个单独的配置,该配置描述哪个视图绑定到哪个模型,并且控制器仅路由到视图,该怎么办?这是错误的而不是MVC吗?
见上文,我想我已经涵盖了这一点.要求控制器根据您的语义需要做某件事.控制器不是单片开关语句,因此不需要在其中进行大量配置.
在node.js中表示视图的好方法是什么?由于它是基于模板的,所提供的模板选项(成熟的)是什么?
"代表一种观点"?嗯,查看引擎自己进行匹配.你真的想写自己的视图引擎吗?可以办到.对视图文件进行标记,找到"控制动词"(缺少更好的名称,我确定它们有一个),在那里插入数据,然后将整个标记化结构渲染为字符串(HTML本身就是一个字符串,没有?).这就是我得到的所有内容.我的建议是,让视图人员进行视图工作,你不需要全部重写.
如果我加载要静态提供的文件(比如CSS文件,通过文件读入内存加载),并且我保留对global/app范围内容的引用,那么后续请求可以直接从内存中提供,从而产生惊人的效果速度,这个假设是否正确?实际上,我们可以保证在第一个请求进入节点服务器(将触发文件读取和内容被加载到mem)之后,所有后续请求将从内存中提供(对于这样的静态内容).
这是一个正确的假设.这就是我要做的事情,使用一般的垃圾收集例程来检查每隔几分钟并粉碎任何超过n分钟的文件,然后重新加载后续请求,确保您获得相对较新的文件.但这实际上是缓存代理所做的,所以是的,这是完全可以接受的.
在raw node.js中获取POST数据的低级(无框架)方法是什么?
你没有.Node为您完成此操作.它已经在请求对象中呈现.