session 在 web 应用中使用很普遍,不过在 node 上面,要用 session 还真得折腾一番才行。

从加入中间件,到 session 的写入、清除,当时是遇到了不少坑的。

当然也可能是我研究还不够透彻,我所写的只是我在实际使用中的所得与总结。

当中如果有什么不对的地方,还望见谅 and 指正了~

首先安装必要模块,打开命令行工具,进入到项目根目录,执行下面指令:

  1. npm install express-session --save
  1. npm install express-mysql-session --save

然后容我一番啪啪啪,啪啪啪...省略一万字...

OK,这次我们不用看项目的目录结构了,因为完全没有变化,只是在代码上做了修改,下面我们看看几个修改后的文件的代码

PS:标红部分是修改过或新增的

app.js:

  1. var express = require('express'),
  2. path = require('path'),
  3. favicon = require('serve-favicon'),
  4. logger = require('morgan'),
  5. cookieParser = require('cookie-parser'),
  6. bodyParser = require('body-parser'),
  7. routes = require('./routes/main'),
  8. mysql = require('mysql'),
  9. settings = require('./data/settings'),
  10. session = require('express-session'),
  11. SessionStore = require('express-mysql-session'),
  12.  
  13. //生成一个 SessionStore 实例
  14. sessionStore = new SessionStore({
  15. host: settings.host,
  16. port: settings.port,
  17. user: settings.user,
  18. password: settings.password,
  19. database: settings.database,
  20. schema: {
  21. tableName: 'session',
  22. columnNames: {
  23. session_id: 'id',
  24. expires: 'expires',
  25. data: 'data'
  26. }
  27. }
  28. }, mysql.createConnection(settings)),
  29.  
  30. //生成一个 express 实例
  31. app = express();
  32.  
  33. //指定 web 应用的标题栏小图标的路径为:/static/favicon.ico
  34. app.use(favicon(path.join(__dirname, 'static', 'favicon.ico')));
  35. //加载日志中间件
  36. app.use(logger('dev'));
  37. //加载解析 json 的中间件
  38. app.use(bodyParser.json());
  39. //加载解析 urlencoded 请求体的中间件
  40. app.use(bodyParser.urlencoded({ extended: false }));
  41. //加载解析 cookie 的中间件
  42. app.use(cookieParser());
  43. //设置 static 文件夹为存放静态文件的目录
  44. app.use(express.static(path.join(__dirname, 'static')));
  45. //加载解析 session 的中间件
  46. app.use(session({
  47. key: settings.sessionKey,
  48. secret: settings.sessionSecret,
  49. cookie: {
  50. maxAge: 6 * 60 * 60 * 1000
  51. },
  52. store: sessionStore,
  53. rolling: true,
  54. resave: false,
  55. saveUninitialized: false
  56. }));
  57.  
  58. //配置路由
  59. routes(app);
  60.  
  61. //捕获404错误,并转发到错误处理器
  62. app.use(function(req, res, next) {
  63. var err = new Error('Not Found');
  64. err.status = 404;
  65. next(err);
  66. });
  67.  
  68. //错误处理器
  69. if (app.get('env') === 'development') {
  70. //开发环境下的错误处理器,将错误信息渲染 error 模版并显示到浏览器中
  71. app.use(function(err, req, res, next) {
  72. res.status(err.status || 500);
  73. res.send('error', {
  74. code: 0,
  75. msg: err.message,
  76. error: err
  77. });
  78. });
  79. }
  80.  
  81. app.use(function(err, req, res, next) {
  82. //生产环境下的错误处理器,不会将错误信息泄露给用户
  83. res.status(err.status || 500);
  84. res.send('error', {
  85. code: 0,
  86. msg: err.message
  87. });
  88. });
  89.  
  90. //导出 app 实例供其他模块调用
  91. 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 的写入很简单

  1. req.session.userName = 'admin';

session 的读取也很简单,像上面写入的值,直接访问 req.session 对应属性就可以了

  1. req.session.userName

session 的移除(指的是从数据表中移除)

  1. req.sessionStore.destroy(req.session.id, function (err) {
  2. if (err) throw err;
  3. //do something ...
  4. });

OK,到目前为止。整个基础项目的搭建就基本完成了。

static目录下面的工作就是完全的客户端工作流了,不在讨论之列。

至于接口的细节实现,后面很有可能还会用到的模块 crypto,它是 node 自带,不用安装。用于数据加密的。

关键字给出了,怎么折腾就是各展神通了。

还有像 connect-flashldapmemcached 等东东,这里也仅给出关键字。因为他们不属于基础,而属于拓展增强。

有需要的自行深造参悟吧~

【Express系列】第4篇——使用session的更多相关文章

  1. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  2. ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  3. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  4. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  5. 【Windows编程】系列第三篇:文本字符输出

    上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...

  6. 深入理解javascript函数系列第三篇——属性和方法

    × 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...

  7. 深入理解javascript作用域系列第四篇——块作用域

    × 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...

  8. 深入理解javascript作用域系列第三篇——声明提升(hoisting)

    × 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javasc ...

  9. 前端工程师技能之photoshop巧用系列第五篇——雪碧图

    × 目录 [1]定义 [2]应用场景 [3]合并[4]实现[5]维护 前面的话 前面已经介绍过,描述性图片最终要合并为雪碧图.本文是photoshop巧用系列第五篇——雪碧图 定义 css雪碧图(sp ...

  10. 前端工程师技能之photoshop巧用系列第四篇——图片格式

    × 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...

随机推荐

  1. Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期

    http://blog.csdn.net/delphiteacher/article/details/8923519 在FireMonkey iOS应用程序中的Calendar FireMonkey使 ...

  2. Python学习-31.Python中集合的一些操作

    add方法: s = {1,2,3} s.add(4) print(s)# {1, 2, 3, 4} 同list的append方法,若调用s.add(3),则不会有任何影响.这点与C#中的HashSe ...

  3. Hyper-V启动虚拟机,消耗C盘大量磁盘空间

    问题描述 经常使用Hyper-V虚拟机的朋友,可能会碰到这样的现象,当启动某些虚拟机的是否,发现C盘的空间突然减少,减少的空间与虚拟机的内存一样大少. 通过分析C盘空间的磁盘文件,发现在Hyper-V ...

  4. 设计模式之复合模式(Compound Pattern)

    一.什么是复合模式? 在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义: 将多个模式结合起来形成一个“框架”,以解决一般性问题 一提到“框架”,可能最容易联想到的 ...

  5. 一般处理程序获取Layui上传的图片

    asp.net利用一般处理程序获取用户上传的图片,上传图片利用的layui 前台页面 <%@ Page Language="C#" AutoEventWireup=" ...

  6. From Alpha to Gamma (I)

    What we think of as conventional alpha-blending is basically wrong. --Tom Forsyth 前段时间在Amazon上淘的三本二手 ...

  7. TCP BBR - 如何安装、启动、停止BBR!

    TCP BBR从Linux 4.9 内核开始,就作为它内核的一部分存在了,如果想使用BBR,那么首先就是判断内核版本是否大于4.9,如果符合版本标准,那么直接启动BBR就可以了,如果低于4.9,升级内 ...

  8. AUTO Uninstaller 双击没有反应,AU_CN点击打不开的解决办法

    AUTO Uninstaller 双击没有反应,AU_CN点击打不开的解决办法 https://pan.baidu.com/s/1cKqdxq0T0DqYfAEkiwuJbw

  9. linux下oracle数据库字符集修改

    linux下oracle数据库字符集修改 0.RHEL6.7.oracle11gr2 1.登录oracle.在安装oracle的用户下进入数据库. $ sqlplus / as sysdba 2.查询 ...

  10. android应用程序的混淆打包

    android应用程序的混淆打包 1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示: target=android- ...