Node.js 中的中间件设计模式:连接

Posted

技术标签:

【中文标题】Node.js 中的中间件设计模式:连接【英文标题】:Middleware design pattern in Node.js: Connect 【发布时间】:2013-07-18 23:42:59 【问题描述】:

这个问题扩展了What is Node.js' Connect, Express and "middleware"?

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

转到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()'ing 其他中间件,是否可以保证调用中间件的顺序?此外,我假设函数 next() 用于调用 next (再次,我如何建立排序?)中间件;但是,没有传递任何参数(req、res、next)。这些参数是否以某种方式隐式传递?

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

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

非常感谢任何帮助。感谢阅读

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

所以如果我有var A = require('./A'), B = require('./B'); app.use(A()); app.use(B());,那么A 会出现在B 之前,而Anext 会调用B?然后参数是否隐式传递?否则B 将如何访问req, res, ect 没错。 reqres 对象正在穿过并且是所有链中的相同对象。因此,您可以在其中保存一些数据,然后稍后在链中的另一个中间件中重用它。这正是req 中的大部分数据所发生的情况。例如,默认不解析 POST 正文数据,express.bodyParser() 中间件将解析它,您可以稍后在链中访问它。 酷!感谢您的回复!

以上是关于Node.js 中的中间件设计模式:连接的主要内容,如果未能解决你的问题,请参考以下文章

Node.js连接Mysql,并把连接集成进Express中间件中

教你编写 Node.js 中间件,实现服务端缓存(附demo源码)

教你编写 Node.js 中间件,实现服务端缓存(附demo源码)

《Koa.js 设计模式-学习笔记》Koa.js第二本开源电子书完结

Java NIO 非阻塞模式 vs node.js 异步操作

Java NIO 非阻塞模式 vs node.js 异步操作