session 在 web 应用中使用很广泛,不过在 node 上面,要用 session 还真得折腾一番才行。node
从加入中间件,到 session 的写入、清除,当时是遇到了很多坑的。mysql
固然也多是我研究还不够透彻,我所写的只是我在实际使用中的所得与总结。git
当中若是有什么不对的地方,还望见谅 and 指正了~github
首先安装必要模块,打开命令行工具,进入到项目根目录,执行下面指令:web
npm install express-session --save
npm install express-mysql-session --save
而后容我一番啪啪啪,啪啪啪...省略一万字...sql
OK,此次咱们不用看项目的目录结构了,由于彻底没有变化,只是在代码上作了修改,下面咱们看看几个修改后的文件的代码express
PS:标红部分是修改过或新增的npm
app.js:json
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 等东东,这里也仅给出关键字。由于他们不属于基础,而属于拓展加强。
有须要的自行深造参悟吧~