18

这个问题扩展了Node.js 的 Connect、Express 和“中间件”是什么?

我正在学习 Javascript -> Node.js -> Connect -> Express -> ... 以了解如何使用现代 Web 开发堆栈。我有低层网络的背景,所以使用 Node.jsnethttp模块很容易。使用服务器将请求路由到不同处理程序的一般模式看起来自然而直观。

转到Connect,恐怕我不了解这个“中间件”的范式和一般数据流。例如,如果我创建了一些用于 Connect ala 的中间件;

// example.js    
module.exports = function (opts) {
    // ...
    return function(req, res, next) {
        // ...
        next();
    };
};

并在 Connect via 中“使用”它

var example = require('./example');
// ...
var server = connect.createServer();
// ...
server.use(example(some_paramater));

我不知道我的中间件何时被调用。此外,如果我正在使用use()其他中间件,是否可以保证调用中间件的顺序?此外,我假设该函数next()用于调用下一个(再次,我如何建立排序?)中间件;但是,没有传递任何参数(req、res、next)。这些参数是否以某种方式隐式传递?

猜测使用的中间件模块的集合是串在一起的,从回调开始 -> 因此在初始请求回调和服务器结束响应的中间http添加了一堆功能。

我正在尝试了解中间件范式以及信息/执行流程。

任何帮助是极大的赞赏。感谢您阅读

4

1 回答 1

15

中间件被称为函数链,其顺序基于中间件定义 order(time) 和匹配的路由(如果适用)。
考虑到req对象res正在通过链传播,因此您可以沿链重用/改进/修改它们中的数据。

中间件有两种一般用例:通用的和特定的。

Generic 就像您在上面的示例中定义的那样:app.use,它将适用于每个请求。next()如果要继续下一个中间件,每个中间件都必须在内部调用。

当您使用app.get('/path', function(...此实际功能时,中间件也是如此,只是内联定义的。所以它有点完全基于中间件,并且没有endware:D

链顺序基于定义顺序。因此,以同步方式或顺序可靠的异步方式定义中间件很重要。否则,当中间件链相互依赖时,不同顺序的中间件可能会破坏逻辑。

一些中间件可以用来断链return next(new Error());。例如,它对于验证或身份验证中间件很有用。
中间件的另一个有用的使用模式是处理和解析请求数据,比如 cookie,或者很好的例子app.use(express.bodyParser());

于 2013-07-19T16:13:07.037 回答