好久好久没有继续更博客了,一直忙着春招实习。。。好惨好惨!
刚到自己的实习公司就接受了一个一周内实现即时通信的web IM的全栈项目。整个人都很懵逼,很少熬夜到一两点的我,一星期发生了三次(我的美容觉),几乎无node基础和数据库经验的我收获满满(伤痕累累)。下面开始我的总结啦(和我一样踩坑的过来看看)~
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:类型为对象,可使用的属性如下:
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
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以及报文主体
body-parser主要做了什么?
body-parser实现的要点如下:
一些简单例子来实现处理不同类型请求体的实现可以查看:
https://www.cnblogs.com/chyingp/p/nodejs-learning-express-body-parser.html
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('some html
');
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( )的区别
app.set('json spaces', 2);
app.set('json replacer', replacer);
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