【Express系列】第4篇——使用session
session 在 web 应用中使用很普遍,不过在 node 上面,要用 session 还真得折腾一番才行。
从加入中间件,到 session 的写入、清除,当时是遇到了不少坑的。
当然也可能是我研究还不够透彻,我所写的只是我在实际使用中的所得与总结。
当中如果有什么不对的地方,还望见谅 and 指正了~
首先安装必要模块,打开命令行工具,进入到项目根目录,执行下面指令:
npm install express-session --save
npm install express-mysql-session --save
然后容我一番啪啪啪,啪啪啪...省略一万字...
OK,这次我们不用看项目的目录结构了,因为完全没有变化,只是在代码上做了修改,下面我们看看几个修改后的文件的代码
PS:标红部分是修改过或新增的
app.js:
var express = require('express'),
path = require('path'),
favicon = require('serve-favicon'),
logger = require('morgan'),
cookieParser = require('cookie-parser'),
bodyParser = require('body-parser'),
routes = require('./routes/main'),
mysql = require('mysql'),
settings = require('./data/settings'),
session = require('express-session'),
SessionStore = require('express-mysql-session'),
//生成一个 SessionStore 实例
sessionStore = new SessionStore({
host: settings.host,
port: settings.port,
user: settings.user,
password: settings.password,
database: settings.database,
schema: {
tableName: 'session',
columnNames: {
session_id: 'id',
expires: 'expires',
data: 'data'
}
}
}, mysql.createConnection(settings)),
//生成一个 express 实例
app = express();
//指定 web 应用的标题栏小图标的路径为:/static/favicon.ico
app.use(favicon(path.join(__dirname, 'static', 'favicon.ico')));
//加载日志中间件
app.use(logger('dev'));
//加载解析 json 的中间件
app.use(bodyParser.json());
//加载解析 urlencoded 请求体的中间件
app.use(bodyParser.urlencoded({ extended: false }));
//加载解析 cookie 的中间件
app.use(cookieParser());
//设置 static 文件夹为存放静态文件的目录
app.use(express.static(path.join(__dirname, 'static')));
//加载解析 session 的中间件
app.use(session({
key: settings.sessionKey,
secret: settings.sessionSecret,
cookie: {
maxAge: 6 * 60 * 60 * 1000
},
store: sessionStore,
rolling: true,
resave: false,
saveUninitialized: false
}));
//配置路由
routes(app);
//捕获404错误,并转发到错误处理器
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
//错误处理器
if (app.get('env') === 'development') {
//开发环境下的错误处理器,将错误信息渲染 error 模版并显示到浏览器中
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.send('error', {
code: 0,
msg: err.message,
error: err
});
});
}
app.use(function(err, req, res, next) {
//生产环境下的错误处理器,不会将错误信息泄露给用户
res.status(err.status || 500);
res.send('error', {
code: 0,
msg: err.message
});
});
//导出 app 实例供其他模块调用
module.exports = app;
嗯嗯~~这就完了。
纳尼,才那么点东西,大失所望?
可怜我当时为了这玩意那折腾啊...
为了基于 mysql 来实现 session,并且确保 session 的成功写入,读取,以及移除...这些代码都是经过一番摸索之后才折腾出来。
原因是官方文档是英文的,而且翻译后也看不懂,只能慢慢试。
市面上关于 express-session 和 express-mysql-session 的中文资料也是少之又少...
当时我是何等的苦不堪言啊...以至于就算是现在,依然对其原理半知不解,囧rz...
只能为大家送上两个传送门,希望有大神参透后能不吝指点迷津吧...
express-session github:https://github.com/expressjs/session
express-mysql-session github:https://github.com/chill117/express-mysql-session
上面两个 github 里有很详细的文档说明(当然是英文),由于这里我只是成功实现的我的需求,但还没完全参透,所以就不班门弄斧去给代码添加详细注释了。
想追根究底的,请自行移步去研究。拿来主义者直接 C+V 吧。
session 的写入很简单
req.session.userName = 'admin';
session 的读取也很简单,像上面写入的值,直接访问 req.session 对应属性就可以了
req.session.userName
session 的移除(指的是从数据表中移除)
req.sessionStore.destroy(req.session.id, function (err) {
if (err) throw err;
//do something ...
});
OK,到目前为止。整个基础项目的搭建就基本完成了。
static目录下面的工作就是完全的客户端工作流了,不在讨论之列。
至于接口的细节实现,后面很有可能还会用到的模块 crypto,它是 node 自带,不用安装。用于数据加密的。
关键字给出了,怎么折腾就是各展神通了。
还有像 connect-flash,ldap,memcached 等东东,这里也仅给出关键字。因为他们不属于基础,而属于拓展增强。
有需要的自行深造参悟吧~
【Express系列】第4篇——使用session的更多相关文章
- 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
背景 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- 【Windows编程】系列第三篇:文本字符输出
上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...
- 深入理解javascript函数系列第三篇——属性和方法
× 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...
- 深入理解javascript作用域系列第四篇——块作用域
× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...
- 深入理解javascript作用域系列第三篇——声明提升(hoisting)
× 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javasc ...
- 前端工程师技能之photoshop巧用系列第五篇——雪碧图
× 目录 [1]定义 [2]应用场景 [3]合并[4]实现[5]维护 前面的话 前面已经介绍过,描述性图片最终要合并为雪碧图.本文是photoshop巧用系列第五篇——雪碧图 定义 css雪碧图(sp ...
- 前端工程师技能之photoshop巧用系列第四篇——图片格式
× 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...
随机推荐
- struts2和JSON的数据交互
一.实验环境 1.struts2基本包 2.json-plugin 在struts2的lib下可以找到. 3.web.xml 加入struts2 <filter> <filter-n ...
- Python学习-27.Python中的列表(list)
列表已经用了很多次了.使用中括号包含元素. list = ['a','b','c'] 获取元素使用[]. print(list[0]) 输出a 不过值得注意的是,[]只能是0到元素个数-1吗?在Pyt ...
- vs web项目远程发布到IIS
一.下载安装 IIS安装管理服务,这里不赘述,安装完后显示如下(装完刷新一下或者重新打开iis) 下载webploy,安装的时候要选中远程功能,或者选择完全安装,否则会因为没有远程模块导致连接失败(注 ...
- 如何连接MSSQLSERVER2014(其他版本数据库大体相同)
购买了服务器后我在上面安装了SqlServer2014,但是程序中总是远程连接不上,特此记录一下: 一.一些基本设置如下链接: 转载自:https://blog.sun0816.com/20381.h ...
- Windows 安装并配置 MySQL 5.6
Windows 下安装 MySQL 有两种方式,一种是下载安装包,根据提示一路 next 安装,不需要什么配置,比较简单:另一种是下载压缩包,通过命令和配置来安装,也不难,个人感觉更简单.本篇就采用第 ...
- 通过sys.objects查询SQL SERVER数据库改动内容
适用于: SQL Server 2008 + .Azure SQL 数据库.Azure SQL 数据仓库.并行数据仓库 系统视图sys.objects,在数据库中用户定义(创建)的每个架构范围对象(例 ...
- Statement与PreparedStatement区别
1.性能区别 Statement statement = conn.createStatement(); PreparedStatement preStatement = conn.prepareSt ...
- 浅谈对MVC的认识
MVC是model(模型),view(视图),Controller(控制)的缩写. 模型层负责提供数据,和数据库相关的操作都交给模型层处理: 视图层提供交互的界面,其输出数据: 控制层负责接收各种请求 ...
- php curl 伪造IP来源的实例代码
来源:http://www.jb51.net/article/31694.htm curl 它不但可以模仿用户登录,还可以模仿用户IP地址哦,为伪造IP来源,本实例仅供参考哦 //伪造ip ; $i ...
- Vue 项目优化,持续更新...
一.减少打包的体积 通过vue-cli 初始化项目后,使用 npm run build 生成的JS文件往往会很大,加载时间过长导致页面长时间白屏,所以我们尽可能的使用一下方法来减少打包体积. 1.1 ...