当前位置: 首页 > news >正文

learning koa2.x

koa2.x learning

路由 koa-router

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

ctx:封装了request 和 response变量

next: 传入将要处理的下一个异步函数

由async标记的函数称为异步函数,在异步函数中,可以用await调用另一个异步函数,这两个关键字将在ES7中引入。

${ctx.request.url} 输出 请求的url 地址 ctx.url相当于ctx.request.url,ctx.type相当于ctx.response.type

处理路由器的操作分为:views、 string、 json、 处理get请求、 处理post请求

views

router.get('/', async (ctx, next) => {
  await ctx.render('index', {
    title: 'Hello Koa 2!'
  })
})

string

router.get('/string',async (ctx, next) =>{ 
    ctx.response.body = `<h1>welcome, hello</h1>`;
})

json

router.get('/json', async (ctx, next) => {
  ctx.body = {
    title: 'koa2 json'
  }
})

处理get请求

var name = ctx.params.name;

router.get('/info/:name', async (ctx, next) => {
  var name = ctx.params.name;
  ctx.response.body = `<h1>Hello, ${name}!</h1>`;
})

处理post请求

var name = ctx.request.body.name || '';

需要引入 koa-bodyparser 中间件, 创建 info.pug 用于处理表单

extends layout

block content
  h1= title
  form(action="/signin" method="post")
    p= '用户名:'
    input(type="text" name="name" value="koa")
    p= '密码:'
    input(type="password" name="password" value="koa")
    p
    input(type="submit" value="提交")
router.get('/info', async (ctx, next) => {
  await ctx.render('info',{
    title: '用户信息'
  });
})
// 处理post请求
router.post('/signin', async (ctx,next) => {
  var name = ctx.request.body.name || '';
  var password = ctx.request.body.password || '';
  if(name === 'koa' && password === 'koa') {
    ctx.response.body = `<h1>welcome, ${name}</h1>`;
  }else{
    ctx.response.body = `<h1>Login faild!</h1>
    <p><a href="/">Login</a></p>
    `
  }
})

视图 - views层

适用于 koa 的模板引擎选择非常多,比如 jade、ejs、nunjucks、handlebars 、xtemplate 等。

Nunjucks是Mozilla开发的一个纯JavaScript编写的模板引擎 koa-nunjucks-2^3.0.2

https://mozilla.github.io/nun...

const koaNunjucks = require('koa-nunjucks-2')
app.use(koaNunjucks({
  ext: 'html',
  path: path.join(__dirname, 'views'),
  nunjucksConfig: {
    trimBlocks: true,
    noCache: false // 开发环境下
  }
}));
// 模块
{% extends 'base.html' %}
{% block body %} <div>No body</div> {% endblock %}

// 循环
{% for msg in data %}
  <p>{{ msg }}</p>
{% endfor %}

{% if hungry %}
  I am hungry
{% elif tired %}
  I am tired
{% else %}
  I am good!
{% endif %}

操作cookie

koa提供了从上下文直接读取、写入cookie的方法:

  • ctx.cookies.get(name, [options]) 读取上下文请求中的cookie
  • ctx.cookies.set(name, value, [options]) 在上下文中写入cookie
// 处理cookie
router.get('/cookie', async (ctx,next) => {
  const options = {
    domain:'127.0.0.1',
    path:'/',
    maxAge: 10 * 60 * 1000, // cookie有效时长
    expires: new Date('2019-02-02'),  // cookie失效时间
    httpOnly: false,  // 是否只用于http请求中获取
    overwrite: false  // 是否允许重写
  }
  ctx.cookies.set('id','test cookie',options)

  ctx.response.body = `<h1>cookies, ${ctx.cookies.get('id')}</h1>`; // 输出cookie值
})

操作session

将session存放在MySQL数据库中 koa-session-minimal、koa-mysql-session "koa-session-minimal":"^3.0.4","koa-mysql-session":"^0.0.2"

const session = require('koa-session-minimal')
const MysqlSession = require('koa-mysql-session')

// 配置存储session
let store = new MysqlSession({
  user: 'root',
  password: '',
  database: 'test',
  host: '127.0.0.1',
})
let cookie = {
  maxAge: '', // cookie有效时长
  expires: '',  // cookie失效时间
  path: '', // 写cookie所在的路径
  domain: '', // 写cookie所在的域名
  httpOnly: '', // 是否只用于http请求中获取
  overwrite: '',  // 是否允许重写
  secure: '',
  sameSite: '',
  signed: '',
  
}
app.use(session({
  key: 'SESSION_ID',
  store: store,
  cookie: cookie
}))
// 处理session
router.get('/session', async (ctx,next) => {
  ctx.session = {
    user_id: Math.random().toString(36).substr(2),
    count: 0
  }
  ctx.response.body = `<h1>session, ${ctx.session.user_id}, ${ctx.session.count}</h1>`; // 输出cookie值
})

操作mysql

安装 mysql "mysql":"^2.15.0"

用户增、删、改、查

// 查询
async function queryAll(){
    let sql = usersMapping.queryAll;
    let UsersList = await dbUtils(sql);
    return UsersList;
}
// 新增
async function insertUser(username,password,realname){
    let sql = usersMapping.insertUser;
    var values = [username,password,realname]; // 数组
    let result = await dbUtils(sql,values);
    if ( Array.isArray(result) && result.length > 0 ) {
        result = result[0]
    } else {
        result = null
    }
    return result
}
// 修改
async function queryById(id){
    let sql = usersMapping.queryById;
    let result = await dbUtils(sql,id);
    if ( Array.isArray(result) && result.length > 0 ) {
        result = result[0]
    } else {
        result = null
    }
    return result
}
async function updateUser(id,username,password,realname){
    // 从session中取 id
    let sql = usersMapping.updateUser;
    var values = [username,password,realname,id]; // 数组
    let result = await dbUtils(sql,values);
    if ( Array.isArray(result) && result.length > 0 ) {
        result = result[0]
    } else {
        result = null
    }
    return result
}
// 删除
async function deleteById(id){
    let sql = usersMapping.deleteById;
    let flag = await dbUtils(sql,id);
    return flag;
}

github:

https://github.com/lichuang44...

相关文章:

  • android开发(14) 可以横向滚动的ListView(固定列头)
  • 2017年度上海市人工智能创新发展项目开始申报
  • VRRP和HSRP
  • 如何编写一个高性能的Angular组件
  • 谷歌为Pwnium***竞赛再掷重金 将提供200万美元奖金
  • MySQL数据库日志介绍
  • heartbeat高可用+lvsDR
  • java并发编程充入锁:ReentrantLock
  • 鱼C扫描器
  • 云栖科技评论第29期:《MIT科技评论》杂志公布2017年度全球十大突破技术
  • 用C语言写的迅雷看看XV文件提取器及C语言源代码
  • NSF之旅:3月6号,今天要完成相关研究和前两个内容的技术路线
  • 通用业务系统基础平台(五) 工作流系统
  • zookeeper -- 第八章 zk开源客户端 Curator介绍 (下)
  • Flex中使用HTTPService与服务器端交换数据
  • 深入了解以太坊
  • 30秒的PHP代码片段(1)数组 - Array
  • Apache Spark Streaming 使用实例
  • Apache的80端口被占用以及访问时报错403
  • classpath对获取配置文件的影响
  • Create React App 使用
  • Js基础知识(四) - js运行原理与机制
  • JS专题之继承
  • leetcode98. Validate Binary Search Tree
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Vue官网教程学习过程中值得记录的一些事情
  • 安卓应用性能调试和优化经验分享
  • 闭包--闭包作用之保存(一)
  • 聊聊sentinel的DegradeSlot
  • 如何胜任知名企业的商业数据分析师?
  • 线上 python http server profile 实践
  • 栈实现走出迷宫(C++)
  • ​Python 3 新特性:类型注解
  • ​插件化DPI在商用WIFI中的价值
  • #14vue3生成表单并跳转到外部地址的方式
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2020)Java后端开发----(面试题和笔试题)
  • (NSDate) 时间 (time )比较
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .md即markdown文件的基本常用编写语法
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET企业级应用架构设计系列之技术选型
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @软考考生,这份软考高分攻略你须知道
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600