My Little World

对于一些模块的探究

express-session

用来提供会话支持,获取用户的会话对象,用来维护用户相关信息
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。 客户的信息都保存在session中。
当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。
session可以和Redis或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失。

常用参数:

secret: 一个String类型的字符串,作为服务器端生成session的签名。
name: 返回客户端的key的名称,默认为connect.sid,也可以自己设置。
resave: (是否允许)当客户端并行发送多个请求时,其中一个请求在另一个请求结束时对session进行修改覆盖并保存。

默认为true。但是(后续版本)有可能默认失效,所以最好手动添加。

saveUninitialized: 初始化session时是否保存到存储。默认为true, 但是(后续版本)有可能默认失效,所以最好手动添加。

cookie: 设置返回到前端key的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。

一些方法:

Session.destroy():删除session,当检测到客户端关闭时调用。

Session.reload():当session有修改时,刷新session。

Session.regenerate():将已有session初始化。

Session.save():保存session。

connect-flash

官方解释
The flash is a special area of the session used for storing messages. Messages are written to the flash and cleared after being displayed to the user. The flash is typically used in combination with redirects, ensuring that the message is available to the next page that is to be rendered.

即一个在session中存放临时信息的地方,显示给用户后,在渲染下一个页面前被清空

函数用法:

(1)如果传入的参数多于两个,那么首先获取第二个以及以后的参数,然后对第二个以后的参数进行format操作,最后把数据封装到req.session.flash中,同时返回
req.flash(‘info’, ‘email has been sent to %s.’, userName);
(2)如果传入的第二个参数是一个数组,那么把这个数组每一个元素封装到req.session.flash中,然后返回特定type的数据的长度
(3)如果仅仅传入了type则返回指定类型的数据,并把数据从req.session.flash中删除

1
2
3
req.flash('info', 'email re-sent');
req.flash('info');// => ['email sent', 'email re-sent']
req.flash('info');// => []这时候info已经清空了

(4)如果用户没有传入任何参数那么返回的原来的局部变量保存到的req.session.flash对象,清空req.session.flash域

实际使用:

安装

1
2
$ npm install express-session //flash放在session中
$ npm install connect-flash

配置

1
2
3
4
5
6
7
8
9
10
var flash = require('connect-flash');
var session = require('express-session');
app.use(session({ //一些参数配置
secret: params1,
key: params2,
cookie: {maxAge: 60000},
resave: false,
saveUninitialized: true
}));
app.use(flash());

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
router.post('/login', function(req, res, next) {
User.get(req.body.username,function(err,user){
if(!user || user.name === ''){
req.flash('error','用户不存在');
return res.redirect('login');
}
if(req.body.password != user.password){
req.flash('error','密码不对');
return res.redirect('login');
}
req.flash('info','登录成功');
res.redirect('login');
})
});

一般和redirect一起使用,保证在渲染下一个页面的时候数据可用