这个问题扩展了 What is Node.js' Connect, Express and "middleware"? 的问题。
我正在学习 Javascript -> Node.js -> Connect -> Express -> ... 以了解如何使用现代 Web 开发堆栈。我有底层网络的背景,所以使用 Node.js 的 net
和 http
模块很容易。使用服务器将请求路由到不同处理程序的一般模式看起来自然而直观。
转到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
回调开始 -> 因此在 中添加了一堆功能初始请求回调和服务器结束响应的中间。
我正在尝试了解中间件范式以及信息/执行流程。
非常感谢任何帮助。感谢阅读
最佳答案
中间件被称为函数链,其顺序基于中间件定义 order(time) 和匹配路由(如果适用)。
考虑到 req
和 res
对象在链中传输,因此您可以沿链重用/改进/修改它们中的数据。
中间件有两种一般用例:通用和特定。
Generic 就像您在上面的示例中定义的那样:app.use
,它将应用于每个请求。每个中间件必须调用 next()
内部,如果它想继续下一个中间件。
当你使用 app.get('/path', function(...
这个实际函数也是中间件,只是内联定义的。所以它有点完全基于中间件,并且没有 endware
:D
链顺序基于定义顺序。因此,以同步方式或顺序可靠的异步方式定义中间件很重要。否则,当中间件链相互依赖时,不同顺序的中间件会破坏逻辑。
一些中间件可以用来断链return next(new Error());
。例如,它对于验证或身份验证中间件很有用。
中间件的另一个有用的使用模式是处理和解析请求数据,比如 cookie,或者是 app.use(express.bodyParser());
.
关于javascript - Node.js 中的中间件设计模式 : Connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17750308/