zoukankan      html  css  js  c++  java
  • 【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-flashldapmemcached 等东东,这里也仅给出关键字。因为他们不属于基础,而属于拓展增强。

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

  • 相关阅读:
    基于MySQL提供的Yum repository安装MySQL5.6
    CentOS中无法使用setup命令 -bash:setup: command not found
    jdk8新特性-亮瞎眼的lambda表达式
    Git branch 分支与合并分支
    (转)Hashtable与ConcurrentHashMap区别
    java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition的解决方案
    一些面试问题以及一些解法
    ipython的使用
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    一些部署django用到的linux命令
  • 原文地址:https://www.cnblogs.com/czf-zone/p/5230072.html
Copyright © 2011-2022 走看看