怎么理解node.js里面的middleware?
巴扎黑
巴扎黑 2017-04-17 13:58:14
[Node.js讨论组]

大家能不能简单的讲讲,或者有什么这方面的博文推荐链接的吗?

巴扎黑
巴扎黑

全部回复(3)
天蓬老师

express官网是这么解释middleware是做什么的:

中间件(middleware)函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件(middleware)函数。下一个中间件函数通常由名为 next 的变量来表示。

我们常见的middleware大概是这样的:

//这里就有刚才提到的req, res和next
//next就是下一个middleware
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

//卧槽,我就是上面那个里面的next
app.use(function (req, res, next) {
  console.log('I am the fucking "next" mentioned above');
  next();
});

中间件函数可以执行以下任务:

  • 执行任何代码。

  • 对请求和响应对象进行更改。

  • 结束请求/响应循环。

  • 调用堆栈中的下一个中间件函数。

我们用一个图来表示中间件(middleware)在应用程序中的形态:

盗图,作者勿怪,发现即通知,我一定删除!

那四个蓝色的方块就是四个不同功能的中间件(middleware),当一个请求从客户端发过来:

  1. 第一个cors先处理(就是给res加了一堆header),这里肯定不会直接返回请求,因为她不是业务主体,只是修改了res对象,然后调用next执行下一个middleware

  2. 第二个csrf又处理(搞了什么自己去查好了),然后再调用next

  3. 第三个auth再处理(看名字也知道是一些鉴权的工作),调用next

  4. 第四个main,通常就是你的业务主体了,或者渲染一个模板、或者返回一段json,总之到此就结束了。(结束,通常是res.render或者res.send之类的方法,把真正的数据返回)

于是,客户端就拿到了响应的数据。

中间件最大的好处就是AOP(面向切面编程),譬如我想为所有的业务逻辑加一个日志,记录操作正确还是失败,还有响应时间,你想想,是直接在cors前面再加一个中间件让他统筹所有的请求好呢?还是你挨个儿在自己每一个业务主体的代码里手写一堆与业务无关的日志代码好!

PHP中文网

这个搜索一下很多结果的,可以看看这一篇文章何为 connect 中间件

大家讲道理

严格上讲,并不是 Node 的中间件,而是 Express 里的中间件,而 Express 中的中间件理念,直接来自于 Connect 这个模块。

Connect 的简介是“Connect is a middleware layer for Node.js”,所以你所说的中间件,应该就是指的这个。

中间件的流程是,接收统一格式的参数,执行操作,然后调用下一个中间件。每一次操作,相对其它的操作都是独立的。也不会直接性的去干涉其它的中间件。

而对于一般的请求来讲,像在 Express 里面,有很多操作利用中间件来实现就比较合理,比如:

  • 用户的身份与鉴权

  • 参数的判断、格式化、筛选等

  • 路由的处理

  • 记录日志

在调用一个中间件时,一般包括以下几个参数:

  • req 请求对象

  • res 响应对象

  • next 调用下一个中间件的方法

  • id 路由中间件传的路由参数

前三个必有,后一个一般没有。

比如,下面就是一个最简单的中间件:

app.use(function(req, res, next){
  console.log('simple middleware');
  next();
});

这里啥都没干,只打印了一句话。

每个中间件对 req / res 对象的修改,其它的中间件也可以读取。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号