koa-session-minimal 的使用方法

作者: kviccn | 来源:发表于2017-03-23 01:39 被阅读2749次

    koa 是一个中间件框架,本身并不能处理 session,在 koa 中处理 session 需要其他中间件的支持。本文用 koa-session-minimalsession 处理的中间件,其他处理 session 的中间件大同小异。

    项目目录结构

    $ find .
    .
    ./app.js
    ./config.js
    ./routes.js
    

    代码
    app.js

    const Koa = require('koa')
    const app = new Koa()
    
    require('./config')(app)
    require('./routes')(app)
    
    app.listen(3000)
    

    config.js

    const bodyParser = require('koa-bodyparser')
    const session = require('koa-session-minimal')
    
    module.exports = app => {
        // 应用解析请求体的中间件, koa-bodyparser 支持 json, form, text 类型的请求体
        app.use(bodyParser())
        // 应用处理 session 的中间件
        app.use(session({
            key: 'session-id',          // cookie 中存储 session-id 时的键名, 默认为 koa:sess
            cookie: {                   // 与 cookie 相关的配置
                domain: 'localhost',    // 写 cookie 所在的域名
                path: '/',              // 写 cookie 所在的路径
                maxAge: 1000 * 30,      // cookie 有效时长
                httpOnly: true,         // 是否只用于 http 请求中获取
                overwrite: false        // 是否允许重写
            }
        }))
    }
    

    routes.js

    const Router = require('koa-router')()
    
    // 模拟数据库, 存储用户信息
    const users = new Map([['laowang', {username: 'laowang', password: '123456'}]])
    
    // 默认提示信息
    const tips = `
        GET     / 查看登录信息
        POST    / {username: laowang; password: 123456} 发此请求以登录
        DELETE  / 注销
    `
    
    module.exports = app => {
    
        // 查看登录信息
        Router.get('/', ctx => {
            // 查看 session 中是否有用户登录信息
            if (ctx.session.user) {
                ctx.body = {
                    status: '您已登录',
                    session: ctx.session.user
                }    
            } else {
                ctx.body = tips
            }
        })
    
        // 登录
        Router.post('/', ctx => {
            // 从请求体中获取用户名和密码
            const { username, password } = ctx.request.body
            // 检查用户是否已经登录
            if (ctx.session.user) {
                ctx.body = `${ctx.session.user.username} 已登录,请勿重复登录`
            }
            // 从'数据库'中查找是否有此用户,有则继续判断密码是否正确
            else if (users.has(username)) {
                // 模拟从数据库查找用户的操作
                const user = users.get(username)
                // 判断用户名和密码是否正确
                if (username === user.username && password === user.password) {
                    // 验证通过则将用户信息写入 session 中
                    ctx.session.user = {
                        username,
                        password
                    }
                    ctx.body = '登陆成功,请访问 GET / 查看session中的信息'
                } else {
                    ctx.body = '用户名或密码不正确'
                }
            } else {
                ctx.body = '用户不存在'
            }
        })
    
        // 注销
        Router.del('/', ctx => {
            ctx.session = null
            ctx.body = '您已注销'
        })
    
        // 处理未匹配到的路由
        Router.get('/*', ctx => {
            ctx.body = tips
        })
    
        app.use(Router.routes())
    }
    

    测试


    测试 GET 请求 设置 Content-Type 测试 POST 请求 登录后查看 session 中的信息 测试 DELETE 请求

    相关文章

      网友评论

      • b465afce1e12:我看了一下token存入了数据库,但是获取时为undefined,怎么回事
      • 小小坤_:按照你的方式 去使用 koa-session-minimal 获取不到 undefined '--------------------------- ctx.session------------------------------'
        b465afce1e12:这个问题你解决没,我也遇到了,急!

      本文标题:koa-session-minimal 的使用方法

      本文链接:https://www.haomeiwen.com/subject/uvwanttx.html