koa-使用session登录
首先我们来看一下与传统的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框架了,看完官网文档基本可以自己用了。还有很多的包没有介绍,自己看图片去查

进入实验
进入首页

接下来进行登录

进行了一次刷新

返回首页刷新一下

因为第一次肯定没有登录,所以不需要进行下个中间件的处理,这次只是做一个简单的小实验,所以就取消了。
如果有人细心看的话,会发现一个问题,为什么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>
整体文件结构

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

