欢迎光临散文网 会员登陆 & 注册

koa-使用session登录

2022-04-18 18:15 作者:鲈鱼懂个der的Java  | 我要投稿

首先我们来看一下与传统的express这个web框架对比起来,koa这个新型的web框架有啥特色。

对比

第一,express框架中有太多的回调函数嵌套等等,容易陷入回调地狱。虽说提供了对应的同步函数,但是不可能每个函数都有对应的同步函数吧?如果我说错了请联系我,谢谢。而在koa中可以直接使用await等待异步函数完成再次执行下去,虽说promise也可以解决回调地狱,当然我们现在不说这个,有没有一种到了天堂的感觉,而且注意mongoose插件对数据库的curd也是异步函数,那么处理函数的时候是不是也可以直接await?不过我记得curd会有对应的数据返回,没办法。第二中间件,在执行中间件的时候,express进行迭代中间件调用的函数是一个普通函数,而在koa中调用的是一个异步函数进行迭代,返回promise对象,第三,对于前面文章中提到的水池概念挖的坑来了

水池概念

在express中如果第一个中间件能够承受所有的水,那么下面的水池则无法获取接下来的水,也可以在第一个水池可以承受所有的水则可以调用next函数进行向下一个水池进行灌水(请求)则代表响应完成,如果无法处理,请求像水一样向下一层的水池进行灌水(请求响应)。调用next函数就像可以跳过水池,

在koa中处理,如果不加next函数,则处理结果和express框架中处理一样,如果,如果加上调用await next()则可以像express框架中上面水池承受住所有的水向下继续处理。

补充一下:koa使用的很多像session的包基本都要自己npm install 包 。

好,开始进行流程分析。

自己建立对应的页面和需要link的css文件夹等。我们从登录页面进行输入密码等,后台收到数据进行对应的session设置,之后客户端进行对应的返回数据。如果存在对应的session返回用户登录成功。

需要的环境和对应的包的引入

首先自己要布置对应的模板,是ejs还是html?这里推荐art-template这个模板引擎,速度快,选择html作为模板,用起来感觉也很不错。记得安装对应的koa框架的这个模板引擎,还有对应koa部署静态文件夹koa-static。还有记得安装koa-session,使用方法自己看官方文档。到看到这个koa框架了,看完官网文档基本可以自己用了。还有很多的包没有介绍,自己看图片去查

具体需要的包

进入实验

进入首页

可以看到没有cookie缓存,第一次进去所以就没有用户登录成功

接下来进行登录

密码和账号都是123,返回密码还是账号自己决定

进行了一次刷新

可以看到输出账号和密码

返回首页刷新一下

记得在第一个中间件if语句中去除await next()

因为第一次肯定没有登录,所以不需要进行下个中间件的处理,这次只是做一个简单的小实验,所以就取消了。

如果有人细心看的话,会发现一个问题,为什么login路由刷新会输出账号密码呢?晚上还有一更,晚上说。哈哈

代码

const Koa = require('koa')

const app = new Koa()

var session = require('koa-session')

var router = require('koa-router')()

var bodyParser = require('koa-bodyparser');

const render = require('koa-art-template');

const staticFiles = require('koa-static')

const path = require('path')

const cors = require('koa-cors');

app.use(cors())

app.use(bodyParser());

app.keys = ['some secret hurr'];

const CONFIG = {

    key: 'koa.sess',

    maxAge: 86400000,

    autoCommit: true,

    overwrite: true,

    httpOnly: true,

    signed: true,

    rolling: false,

    renew: true,

    // http报文和https报文

    secure: false,

    sameSite: null,

    // 设置代理

    Proxy: true

};

render(app, {

    root: path.join(__dirname, 'views'),

    // 配置模板后缀名为html

    extname: '.html',

    debug: process.env.NODE_ENV !== 'production'

});

app.use(session(CONFIG, app));

app.use(staticFiles(path.join(__dirname, 'public')))

// 配置起始页的中间件

app.use(async (ctx, next) => {

    if (ctx.session.isLogin == true) {

        console.log('起始用户登录成功');

        console.log('count', ctx.session.count);

        console.log('password', ctx.session.password);

        ctx.body = '登陆成功'

    }

    else {

        console.log('没有登录,请用户进行登录');

        await next()

    }

})


// 配置首页

router.get('/', (ctx, next) => {

    ctx.render('index')

})


router.post('/login', (ctx, next) => {

    ctx.session.isLogin = true

    ctx.session.count = ctx.request.body.count

    ctx.session.password = ctx.request.body.password

    ctx.body = ctx.session.count

})


app.use(router.routes());

app.use(router.allowedMethods());

app.listen(8000, () => {

    console.log('http://127.0.0.1:8000');

});

html源码    

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <link rel="stylesheet" href="/css/bootstrap.css">

</head>

<body>

    <form  class="form-inline" action="/login" method="post">

        <div class="form-group">

            <label class="sr-only" for="count">账号</label>

            <input type="text" class="form-control" id="count" placeholder="Input field" name="count">

        </div>

        <div class="form-group">

            <label class="sr-only" for="password">密码</label>

            <input type="password" class="form-control" id="password" placeholder="Input field" name="password">

        </div>

        <button type="submit" class="btn btn-primary">点击登录</button>

</body>

</html>

整体文件结构

css文件

实验做完了,觉得有帮助的给个赞吧,不容易啊,呜呜呜

koa-使用session登录的评论 (共 条)

分享到微博请遵守国家法律