实现webIM技术小结——框架配置篇

好久好久没有继续更博客了,一直忙着春招实习。。。好惨好惨!

刚到自己的实习公司就接受了一个一周内实现即时通信的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实现的要点如下:

  1. 处理不同类型的请求体: 比如text/json/urlencoded等,对应的报文主体的格式不同
  2. 处理不同的编码:比如utf8/gbk等
  3. 处理不同的压缩类型:比如gzip/deflare等
  4. 其他边界,异常的处理

一些简单例子来实现处理不同类型请求体的实现可以查看:

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('

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( )的区别

  • 当传递对象或数组时,这两个方法是相同的,但是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

 

 

 

 

 

 

你可能感兴趣的:(前端框架,node)