刚开始学习Express的时候,在 app.js 中发现 app.use,当时比较困惑。

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

这里其实就是定义使用了中间件(Middleware)。Express 框架实际上是依赖 Connect 创建的,这里的 use 方法是 Conncet 提供的,它用来注册一个中间件到 Connect 中间件队列。 什么是中间件? 我的理解是这样的,中间件就是类似于一个过滤器的东西,在客户端和应用程序之间的一个处理请求和响应的的方法。

什么是 Connect? Connect 是 Node.js 中的一个模块,可以用来创建中间件的一个框架,它自身已经包装了 Node 的 HTTP 模块的 Server 以及 Server 的 req 和 res 的对象。它干的活其实就是处理请求,然后响应客户端或是让下一个中间件继续处理,它的原型是这个样子的

function (req, res, next) {
  // 中间件
}

当 next 回调函数被调用,中间件就完成工作并传递到下一个中间件,如果没其他中间件则进入到应用逻辑继续执行。

下面来写一个简单的脚本,自己注册 2 个中间件来理解下:

var connect = require('connect'),
    http = require('http');

var app = connect()
    .use(access)
    .use(test);

function access(req, res, next) {
    var now = new Date().getHours();
    if (now < 13 || now > 18) {
        res.writeHead(503, { 'Content-Type': 'text/plain' });
        res.end('下午1点到6点之外禁止访问!');
    } else {
        next();
    }
}

function test(req, res) {
    res.writeHead(200, { 'Connect-Type': 'text/plain' });
    res.end('this is test page');
}

http.Server(app).listen(3000);

这这段代码中,我们注册了 2 个中间 access 和 test 到中间件队列中,这里需要注意的一点就是,Connect 是流式处理。通过执行这段代码以后,浏览器访问以下体会吧!

参考:

Express API 中提供的中间件  http://expressjs.jser.us/api.html Connect 中间件 http://www.senchalabs.org/connect/

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: 理解 Node.js 中间件以及 Connect 模块

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可