- 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'));