好久好久没有继续更博客了,一直忙着春招实习。。。好惨好惨!
刚到自己的实习公司就接受了一个一周内实现即时通信的web IM的全栈项目。整个人都很懵逼,很少熬夜到一两点的我,一星期发生了三次(我的美容觉),几乎无node基础和数据库经验的我收获满满(伤痕累累)。下面开始我的总结啦(和我一样踩坑的过来看看)~
Express常用中间件cookie-parser
1.cookie的设置
express直接提供了API,只需要在需要使用的地方调用如下API即可,他会将其填入response header中的set-Cookie,达到在浏览器中设置cookie的作用。
function(req, res, next) {
...
res.cookie(name, value[, options]))
...
}
注意:其中的value类型为string和object。如果是object会在cookie.serialize()之前自动调用JSON.stringify对其进行处理。
option:类型为对象,可使用的属性如下:
- domain:cookie在什么域名下有效,类型为String,。默认为网站域名
- expires: cookie过期时间,类型为Date。如果没有设置或者设置为0,那么该cookie只在这个这个session有效,即关闭浏览器后,这个cookie会被浏览器删除。
- httpOnly: 只能被web server访问,类型Boolean。
- maxAge: 实现expires的功能,设置cookie过期的时间,类型为String,指明从现在开始,多少毫秒以后,cookie到期。
- path: cookie在什么路径下有效,默认为'/',类型为String
- secure:只能被HTTPS使用,类型Boolean,默认为false
- signed:使用签名,类型Boolean,默认为false。`express会使用req.secret来完成签名,需要cookie-parser配合使用·
2. cookie的删除
express直接提供了API删除浏览器中的cookie,只需要在需要使用的额地方调用如下API
function(req, res, next) {
...
res.clearCookie(name [, options]))
...
}
3.利用cookie-parser读取cookie
cookie-parser是一个非常好用方便的插件,它会将解析后的unsigned cookie保存在req.cookies中,而解析后的signed cookie只保存在req.signedCookies中。使用cookie-parser插件,后续代码直接使用req.cookies或者req.signedCookies即可。
可以直接用在express和connect中,官文地址为https://www.npmjs.com/package/cookie-parser。npm安装命令:$npm install cookie-parser --save
var express = require('express');
var cookieParser = require('cookie-parser')
var app = express();
// 不使用签名
app.use(cookieParser());
// 若需要使用签名,需要指定一个secret,字符串,否则会报错
app.use(cookieParser('Coco'));
PS: 即使在创建cookieParser时(传入了secret字符串) , cookie也不会自动加密, 需要使用res.cookie(name, value , {singed: true}) 去创建加密的cookie, 以及使用req.signedCookies来获取解密后的cookie。
底层详解请查看:https://segmentfault.com/a/1190000004139342
Express常用中间件body-parser
body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析,使用非常简单,一下两行代码覆盖了大部分的使用场景。
app.use(bodyParser.json());
app.use(bodyparser.urlencoded({ extended: false }));
一个post请求的报文如下:
POST /test HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: text/plain; charset=utf8
Content-Encoding: gzip
其中需要我们注意的有content-type/content-encoding以及报文主体
- content-type:请求报文主体的类型/编码。常见的类型有text/plain,application/json,application/x-www-form-urlencoded。常见的编码有utf8 ,gbk等
- content-encoding:声明报文主体的压缩格式,常见的取值有gzip/deflate/identity
- 报文主体:这里是颇通的文本字符串chyingp
body-parser主要做了什么?
body-parser实现的要点如下:
- 处理不同类型的请求体: 比如text/json/urlencoded等,对应的报文主体的格式不同
- 处理不同的编码:比如utf8/gbk等
- 处理不同的压缩类型:比如gzip/deflare等
- 其他边界,异常的处理
一些简单例子来实现处理不同类型请求体的实现可以查看:
https://www.cnblogs.com/chyingp/p/nodejs-learning-express-body-parser.html
express中 res.json( )和 res.send( )
res.json([body])
发送一个json的响应。这个方法和将一个对象或者一个数组作为参数传递给res.send()方法的效果相同。不过可以使用这个方法来转换其他的值到json,例如null, undefined。
res.json(null);
res.json({user: 'tobi'});
res.status(500).json({error: 'message'});
res.send([body])
发送HTTP响应。body参数可以是一个buffer对象,一个字符串,一个对象,或者一个数组。比如:
res.send(new Buffer('whoop'));
res.send({some:'json'});
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });
对于一般的非流请求,这个方法可以执行许多有用的的任务:比如,它自动给Content-LengthHTTP响应头赋值(除非先前定义),也支持自动的HEAD和HTTP缓存更新。
res.send( )和res.json( )的区别
- 当传递对象或数组时,这两个方法是相同的,但是res.json()也会转换非对象,如null和undefined,这些无效的JSON
- 该方法还使用json replaceacer和json spaces的设置,因此您可以使用更多选项格式化JSON。例如:
app.set('json spaces', 2);
app.set('json replacer', replacer);
- 传递给JSON.stringify()类似:
JSON.stringify(value, replacer, spacing); // value:需要格式化的对象 // replacer:stringfiy时如何转化属性的规则 // spacing: 锁紧的空格数量
res.json方法中的res.send部分没有的代码:
var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(obj, replacer, spaces);
最终它使用res.send发送请求
this.charset= this.charset|| ‘utf-8’;
this.get(‘content-Type’) || this.set('Content-Type', 'application/json');
return this.send(body);
express的API查看学习参考:https://expressjs.com/zh-cn/api.html