koa-session-minimal 的使用方法

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 请求
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接:http://www.jianshu.com/p/6b816c609669 前传 出于兴趣最近开始研究k...
    悬笔e绝阅读 7,252评论 1 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,032评论 19 139
  • Koa2-blog 2018-1-5 更新教程(新增上传头像、新增分页、样式改版、发布文章和评论支持markdow...
    wclimb阅读 9,224评论 1 53
  • 前传 出于兴趣最近开始研究koa2,由于之前有过一些express经验,以为koa还是很好上手的,但是用起来发现还...
    阿_希爸阅读 119,735评论 81 240
  • JUnit 4和TestNG都是Java中非常受欢迎的单元测试框架。两种框架在功能上看起来非常相似。 哪一个更好?...
    易百教程阅读 5,016评论 2 6