阅读数:

nodejs hapi(二) server session

0

说明

上一篇我们搭建了基本的hapi server,从本篇开始我们将“添砖增瓦”,今天我们讨论是server session会话的问题。
作为web server,session保持是必须要有的基础功能,用来验证用户请求的合法性。在express中
我们可以用express-session 插件,app.use(session({…options}))来实现。hapi也是类似,可以用hapi-server-session,但具体引用并不像express来的直接。因为hapi倡导的是configure rather than
coding ,官方都是提供都是以plugin的方式进行注册引用。具体实现如下

实现

npm install hapi-server-session –save
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
'use strict';
const init = async() => {
....
await server.register({
plugin: require('hapi-server-session'),
options: {
cookie: {
path: '/',
},
expiresIn:10*1000,
key:'hapi',
name:'hapi'
},
});
await server.start();
console.log(`Server running at: ${server.info.uri}`);
};
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();

这样我们实现了简单的会话存储,但这只是基于neicun模式。如果要用类似pm2进行
cluser进行部署的话session 进程之间没法共享。hapi也支持cache方式配置
eg:mongo,redis等。这里介绍一下redis的配置方法:我们需要依赖一个组件catbox-redis,然后需要在sever实例化的时候进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
const server = Hapi.server({
port: 3000,
host: 'localhost',
cache: [{
name: 'redisCache',
engine: require('catbox-redis'),
host: '172.*.*.115',
partition: 'cache',
port: 6379,
password: 'xxx',
}],
});

至于其它的cache option参数可以参见catbox-redis官方说明

这样就实现了利用redis进行缓存,当然包括会话数据,当然也可以用来存储其它缓存数据,下面我们以用户会话举例。
很简单的一个场景:某接口或者页面需要用户登录后才可访问;
1、登录
用户登录完,session记录用户基本信息;

1
2
3
4
5
6
7
8
9
10
11
12
13
server.route({
method: 'GET',
path: '/login',
handler: function (request, h) {
if(request.session.user){
return 'logining';
}
request.session.user = {
name: 'jack'
}
return h.response('Success');
};
});

2、api请求资源

1
2
3
4
5
6
7
8
9
10
server.route({
method: 'GET',
path: '/getresource',
handler: function(request, h) {
if(!request.session.user){
return 'no login';
}
return 'getresource';
}
});

3、测试
先登录,后getresource,结果返回‘getresource’,当10s后则反馈‘no login’,因为我们的会话时间设置的是10s

4、这样我们就简单的实现了资源访问之前的会话验证。

最后

如有疑问或者更好的方案留言下方……^_^


^-^欢迎回复交流^-^


0
赏点咖啡钱^.^