这个问题延伸到What is Node.js' Connect, Express and "middleware"?
我要学习Javascript的路线 - > Node.js - >连接 - >快递 - > ...为了学习使用现代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()
其他middlware,我可以保证调用中间件的顺序吗?更重要的是,我假设函数next()
用于调用 next (再次,如何建立排序?)中间件;但是,没有传递参数(req,res,next)。这些参数是否以某种方式隐式传递?
我猜测所使用的中间件模块集合是串在一起的,从http
回调开始 - >因此,在初始请求回调的 middle 中添加了一堆功能,服务器结束了响应。
我正在尝试理解中间件范例,以及信息/执行流程。
非常感谢任何帮助。感谢您阅读
答案 0 :(得分:13)
中间件被称为函数链,其顺序基于具有匹配路由的中间件定义顺序(时间)(如果适用)。
考虑到req
和res
个对象在链中传播,因此您可以在链中重复/改进/修改数据。
中间件有两个常见用例:通用和特定。
Generic就像您在上面的示例中定义的那样:app.use
,它将适用于每个请求。如果要进入下一个中间件,每个中间件都必须在内部调用next()
。
使用app.get('/path', function(...
时,这个实际功能也是中间件,只是内联定义。所以它完全基于中间件,并且没有endware
:D
链顺序基于定义顺序。因此,以同步方式或顺序可靠的异步方式定义中间件非常重要。否则,当中间件链相互依赖时,不同的中间件顺序可能会破坏逻辑。
某些中间件可用于打破链return next(new Error());
。例如,它对验证或认证中间件很有用
中间件使用的另一种有用模式是处理和解析请求数据,如cookie,或此类app.use(express.bodyParser());
的良好示例。