【nodeJs】 Connect自带的中间件,会话管理、cookie解析、请求主体解析、请求日志等。

时间:2023-01-03 03:54:55
  • connect自带中间件
中间件组件 介绍
cookieParser() 为后续中间件提供 req.cookies 和 req.signedCookies
bodyParser() 为后续中间件提供 req.body 和 req.files
limit() 基于给定字节长度限制请求主体的大小。必须用在 bodyParser 中间件之前
query() 为后续中间件提供 req.query(解析POST表单请求)
logger() 将HTTP请求的信息输出到stdout或日志文件之类的流中
favicon() 响应 /favicon.ico HTTP 请求。通常放在中间件 logger 前面,这样它就不会出现在你的日志文件中了
methodOverride() 可以替不能使用正确请求方法的浏览器仿造 req.method ,依赖于 bodyParser
vhost() 根据指定的主机名(比如nodejs.org)使用给定的中间件和/或HTTP服务器实例
session() 为用户设置一个HTTP会话,并提供一个可以跨越请求的持久化 req.session 对象。依赖于 cookieParser
basicAuth() 为程序提供HTTP基本认证
csrf() 防止HTTP表单中的跨站请求伪造攻击,依赖于 session
errorHandler() 当出现错误时把堆栈跟踪信息返回给客户端。在开发时很实用,不过不要用在生产环境中
static() 把指定目录中的文件发给HTTP客户端。跟Connect的挂载功能配合得很好
compress() 用gzip压缩优化HTTP响应
directory() 为HTTP客户端提供目录清单服务,基于客户端的Accept请求头(普通文本,JSON或HTML)提供经过优化的结果

一些简单的使用方法
1. bodyParser() :解析表单的POST请求

  • 所有Web程序都需要接受用户的输入。假设你要用HTML标签 接受
    用户上传的文件。添加 bodyParser() 中间件就够了。 实
    际上它整合了其他三个更小的组件: json() , urlencoded() , 和 multipart() 。
  • 基本用法只需要把 bodyParser() 组件放在所有会访问 req.body 对象的中间件前面。
var app = connect()
.use(connect.bodyParser())
.use(function(req, res){
    //注册用户
    res.end(req.body.username)
})

2 . limit():请求主体的限制。limit()中间件组件的目的是帮助过滤巨型的请求,不管它们是不是恶意的

  • 在 bodyParser() 之前加上 limit() 组件,你可以指定请求主体的最大长度,既可以是字节
    数(比如1024),也可以用下面任意一种方式表示:1gb、25mb或50kb。
    如果你将limit() 设定为32kb,你会看到Connect在请求到32kb的时候终止了请求:
var app = connect()
.use(connect.limit(32kb))
.use(connect.bodyParser())

http .createServer(app).listen(3000)

3 . query() :查询字符串解析
* bodyParser() ,可以解析表单的POST请求,但GET请求怎么解析呢?用
query() 中间件。它解析查询字符串,为程序提供 req.query 对象。 query() 跟 bodyParser() 一样,也要放在其他会用到它的中间件前面。

  • 基本用法
它会将请求发送过来的查询字符串以JSON格式作为响应返回去。
var app = connect()
.use(connect.query)
.use(function(req, res, next){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify(req.query))
})

4.static() :静态文件服务
* static() 中间件实现了一个静态文件服务器,支持HTTP缓存机制、范围请求等。更重要的是,它有对恶意路径的安全检查,默认不允许访问隐藏文件(文件名以.开头)。

  • 基本用法
app.use(connect.static('public'))   //返回的是public目录下的静态资源文件, GET index.js
  • 使用带挂载的static()
app.use('/app/files', connect.static('public')) //应该使用GET /app/files/index.js才能得到这个文件
  • 绝对与相对目录路径
传到 static() 中的路径是相对于当前工作目录的。也就是说将 "public" 作为路径传入会被解析为:
process.cwd() + "public" 。
然而有时你可能想用绝对路径指定根目录,变量 __dirname就派上用场了:
app.use('/app/files', connect.static(__dirname + '/public'));