一些Connect术语

时间:2011-08-08 22:16:36

标签: node.js express

以下是与ConnectJS for NodeJS相关的文档中使用的三个术语,这些术语一直在使用,但我并不完全理解:

1)观点和控制器

2)部分和集合

3)中间件

2 个答案:

答案 0 :(得分:8)

让我们从下往上开始。

0级:内置http模块

最初,有一个由Ryan Dahl编写的node.js的内置http.Server。您编写了function(req, res),每次接受新连接时,Node都会调用您的函数:

// Hello world HTTP server using http module:
var http = require('http');
var app = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, world.');
});
app.listen(8080, '127.0.0.1');

1级:连接

由Tim Caswell编写的

Connect只是http.Server的一个子类,可以更轻松地组织代码。您可以将一些中间件链接在一起,而不是编写处理每个请求的单个回调。每个中间件都是function(req, res, next),如果可能,它会处理请求,如果没有完成处理用户的请求,则调用next(error)。中间件处理程序按其use的顺序调用;你应该在最后调用全能app.use(connect.errorHandler())

一个重要的中间件是路由器,它允许您根据URL路径的模式过滤一些中间件。 syntax for the route patterns基于ruby的Sinatra路线。当我使用过滤器/hello/:name时,req.params.name将设置为网址的匹配部分。

var connect = require('connect');
var app = connect.createServer();
app.use(connect.favicon());
app.use(connect.logger());,
app.use(connect.router(function(app) {
  app.get('/hello/:name', function(req, res, next) {
    try {
      if (Math.random() > 0.5) {
        throw new Error('Random error!');
      }
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello, ' + req.params.name);
    } catch (e) {
      return next(e);
    }
  });
}));
app.listen(8080, '127.0.0.1');

在Connect中,每个处理程序都是中间件!您可以使用bodyParser或cookieParser所需的任何功能,并且您自己的业务逻辑也是具有相同签名function(req, res, next)的中间件功能。 connect homepage提供了内置中间件的列表。

第2级:Express.js

Express的http服务器由TJ Holowaychuk编写,反过来又成为Connect的一个子类,它更强调Sinatra风格。在Connect中,没有你没有要求的魔法,但在Express中,路由器和qs解析器(设置req.query)自动use d。清除路由器语法;你直接打电话给app.getapp.post等(并且路由器位于第一次通话时),而不是将它们放在一个功能中。

Express还包含许多其他well-documented功能和帮助函数来扩展app,req和res。

Express的一个功能是res.render,它使用扩展名隐含的模板引擎和app.set('views')呈现给定的模板文件(相对于res.partial或$ PWD / views),它在集合的每个元素上调用渲染(这只是任何arraylike对象)。但我没有使用这个可选功能;如果你不关心快递的模板,你可以自己res.send数据。

答案 1 :(得分:3)

以下是一些评论。如果您有更具体的问题,我们可以尝试解决它们。

1)观点和控制器

视图只是意味着可用于呈现响应的模板,该模板通常是HTML,但可以是纯文本或其他格式。有许多不同的模板语法和系统。有些工作在NodeJS以及Web浏览器中。这就是观点。

控制器是MVC设计模式中的“C”,负责作为视图和模型之间的中介。它们基本上是处理一些基本内容的粘合剂,例如不属于模型代码的格式选择。

2)部分和集合

(旁注,这些都是Express.js的一部分,而不是Connect,但它们是同级库)

Partials是一个文档模板,表示文档的一小部分或片段,而不是完整的HTML文档。部分可以包含在其他模板中,并且通常由多个包含模板重复使用。收藏与他们携手并进。例如,您可能有部分显示“总统”对象,并且在该部分中您有照片的标记,他担任总统,政党等的日期。您可以在整个网站中使用相同的部分想要显示“总统”记录/对象。如果您拥有多个“总统”对象的集合,“集合”可以让您轻松地说“在此列表中为每个总统对象渲染一个总统”。

3)中间件

连接处理响应HTTP请求的方式是通过一系列称为中间件的函数来路由请求。每个中间件功能都遵循(req, res, next)的基本API和一些行为要求。每个中间件都可以执行一个特定的处理,然后在完成后,调用next()告诉connect继续进行链中的下一个中间件功能。 Connect附带了一堆中间件模块,您可以看到on github。中间件可以做任何想做的事情。例如,解析JSON请求主体,在文件系统中搜索要提供的匹配静态文件,检查会话cookie,登录日志文件等。这种设计使得重用代码以及以新颖的组合方式组合单独的中间件功能变得非常容易。一些中间件函数处理解析和处理请求,一些处理生成响应。通常,您可以找到执行大量请求处理(解析,日志记录,解码,转换等)的现有中间件函数,并提供自己的中间件来实际呈现响应,这通常也是链中的最后一个中间件。