connect强大之处在于它自带的中间件,它可以满足web开发的常见需求,比如:
中间件组件介绍cookieParser()为后续中间件提供req.cookies和req.signedCookiesbodyParser()为后续中间件提供req.body和req.fileslimit()基于给定字节长度限制请求主体的大小,必须用在bodyParser中间件之前query()为后续中间件提供req.querylogger()将HTTP请求的信息输出到stdout或日志文件之类的流中favicon()响应/favicon.ico HTTP请求。通常放在中间件logger前面,这样它就不会出现在你的日志文件中了methodOverride()可以替不能使用正确请求方法的浏览器仿造req.method,依赖于bodyParservhost()根据指定的主机名使用给定的中间件和/或HTTP服务器实例session()为用户设置一个HTTP会话,并提供一个可以跨越请求的持久化req.session对象。依赖于cookieParserbasicAuth()为程序提供HTTP基本认证csrf()防止HTTP表单中的跨站请求伪造攻击,依赖于sessionerrorHandler()当出现错误时把堆栈跟踪信息返回给客户端。在开发时很实用,不过不要用在生产环境中static()把指定目录中的文件发给HTTP客户端。跟Connect的挂载功能配合得很好compress()用gzip压缩优化HTTP响应directory()为HTTP客户端提供目录清单服务,基于客户端的Accept请求头提供经过优化的结果
cookieParser() 可以解析常规cookie,签名cookie和JSON cookie。
2.常规cookie
需要安装 cookie-parser这个包,其中"lalalala"是签名密钥
const connect = require('connect'); const cookieParser = require('cookie-parser'); var app = connect() .use(cookieParser('lalalala')) .use(function (req, res) { console.log(req.cookies); console.log(req.signedCookies); res.end('hello\n'); }).listen(3000);4.JSON cookie
JSON cookie带有前缀j 告诉connect它是一个串行化的JSON。
... res.setHeader('set-cookie','bar=j:{"foo":"bar"}'); ...
如果只是想解析x-www-form-urlencoded,仅仅在中间件使用bodyParser即可。
const bodyParser = require('body-parser'); const fs = require('fs'); var app = connect() .use(bodyParser.urlencoded({ extended: false })) .use(function (req, res, next) { console.log(req.body); }) .listen(3000);解析application/json需要加载json()中间件:
app.use(bodyParser.json());其中使用了bodyParser.urlencoded函数
extended: false:表示使用系统模块querystring来处理,也是官方推荐的extended: true:表示使用第三方模块qs来处理从功能性来讲,qs比querystring要更强大,所以这里可以根据项目的实际需求来考虑
需要限制请求主体的大小,避免大文件拖住服务器。
需要引用connect-query解析query
下面这个小程序接收query并且发送回去
const query = require('connect-query'); var app = connect() .use(bodyParser.urlencoded({ extended: false })) .use(query()) .use((req,res,next)=>{ res.end(JSON.stringify(req.query)); }) app.listen(3000);
1.基本用法
直接调用logger即可。
const logger = require("connect-logger"); var app = connect() .use(logger()) app.listen(3000);2.定制日志格式
使用%method格式,和书中有些许差异
.use(logger({ format: `