一些Connect术语

Ran*_*lue 3 node.js express

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

1)视图和控制器

2)部分和收藏

3)中间件

yon*_*ran 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');
Run Code Online (Sandbox Code Playgroud)

1级:连接

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

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

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');
Run Code Online (Sandbox Code Playgroud)

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

第2级:Express.js

由TJ Holowaychuk编写的Express的http服务器又是Connect的一个子类,它更强调Sinatra风格.在Connect中,没有你没有要求的魔法,但在Express中,路由器和qs解析器(设置req.query)是自动used.清除路由器语法; 你打电话app.get,app.post等直接(和路由器被放置在第一次调用),而不是把他们一个函数内.

Express还包含许多其他记录良好的功能和帮助函数,以扩展app,req和res.

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