KOA2基础

KOA2
  • 官方API
  • {extended:true} 默认引用BodyParser插件,koa需要啥就下载啥,koa-router是中间件
  • Koa – 基于 Node.js 平台的下一代 web 开发框架
  • Koa 是由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用async 函数,Koa丢弃了回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
  • 安装:npm i koa
  • 应用程序:Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。 Koa 类似于你可能遇到过的许多其他中间件系统,例如 Ruby 的 Rack ,Connect 等,然而,一个关键的设计点是在其低级中间件层中提供高级“语法糖”。 这提高了互操作性,稳健性,并使书写中间件更加愉快。这包括诸如内容协商,缓存清理,代理支持和重定向等常见任务的方法。 尽管提供了相当多的有用的方法Koa 仍保持了一个很小的体积,因为没有捆绑中间件。
  • 上下文(Context):Koa Context 将 node 的 request 和 response 对象封装到单个对象中,每个请求都将创建一个 Context,并在中间件中作为接收器引用。
  • 注:ctx.type 和 ctx.length 委托给 response 对象ctx.path 和 ctx.method 委托给request
  • 中间件:中间件就是匹配路由之前或者匹配路由完成之后所得一系列操作,通过next 来实现,使用app.use() 注册的函数,
    • 应用级中间件: 匹配路由之前所做的一系列操作
    • 路由级中间件:只对这一个路由有作用,而不是对整个应用的路由都有作用,所以叫做路由级中间件;
    • 错误处理中间件
    • 第三方中间件
  • 中间件:koa2 的中间件是洋葱模型基于async/await可以更好的处理异步操作。
    在这里插入图片描述
  • 原生路由:通过ctx.path 可以获取用户请求的路径
  • koa-router 中间件 安装:npm i koa-router
  • get请求
    • query:返回的是格式化好的参数对象
    • querystring:返回的是请求字符串
  • post请求
    • 第三方中间件
      • koa-bodyparser 中间件:安装:`npm i koa-bodyparser``
      • koa-static 中间件:安装:npm i koa-static
      • ejs 模板引擎中间件:安装:npm i koa-views ejs
      • cookie:KOA中使用cookie不需要下载插件直接使用即可。
        • ctx.cookies.set(name,value,[options])
        • 取值:ctx.cookies.get(name)
        • 注:在koa 中的cookie 值不可以使用中文,但可以将中文作为buffer使用
      • session:安装:npm i koa-session
KOA的世界
const koa=require("koa");
const app = new koa();
app.use(ctx=>{
    ctx.body="Hello KOA!";//响应属性body,用来将响应数据返回给浏览器。
    ctx.body={username:"rypy",pwd:123456};
})
app.listen(1000);
KOA的原生路由
const koa=require("koa");
const fs=require("fs");
const app=new koa();
let indexhtml=fs.readFileSync("./index.html","utf8");
let indexcss=fs.readFileSync("./index.css","utf8");
//KOA中默认的资源文件类型就是html
app.use(ctx=>{
    switch(ctx.path){
        case "/index.html":ctx.body=indexhtml;break;
        case "/index.css":ctx.type="text/css";ctx.body=indexcss;break;
    }
    // console.log(ctx.path); // / /favicon.ico /index.html /index.css
    // ctx.body="";
});
app.listen(1001);
KOA的路由中间件
const koa=require("koa");
const Router=require("koa-router");
const app=new koa();
const router =new Router();
router.get("/",ctx=>{
    ctx.body="我是路由中间件的首页路由";
});
router.post("/aaa",ctx=>{
   ctx.body="我是post方法"; 
});
router.put("/bbb",ctx=>{
    ctx.body="我是put方法";
});
app.use(router.routes());//可以使用routes()方法将路由中间件绑定到koa应用中
app.listen(1002);
KOA获取get请求参数
const koa=require("koa");
const Router=require("koa-router");
const app=new koa();
const router =new Router();
router.get("/",ctx=>{
    //KOA中获取get请求参数采用ctx.query以对象的形式获取参数,querystring以URL类型的字符串参数获取
    console.log(ctx.query);//[Object: null prototype] { username: 'rypy', pwd: '123' }
    console.log(ctx.querystring);//username=rypy&pwd=123
    ctx.body="我是路由中间件的首页路由";
});
//注:在KOA中如果需要在post响应中获取post请求的参数,需要下载插件
router.post("/aaa",ctx=>{
   ctx.body="我是post方法"; //Not Found
});
app.use(router.routes());//可以使用routes()方法将路由中间件绑定到koa应用中
app.listen(1003);
KOA获取post请求参数
const koa=require("koa");
const Router=require("koa-router");
const bodyParser=require("koa-bodyparser");
const app=new koa();
const router =new Router();
router.get("/",ctx=>{
    //KOA中获取get请求参数采用ctx.query以对象的形式获取参数,querystring以URL类型的字符串参数获取
    console.log(ctx.query);
    console.log(ctx.querystring);
    ctx.body="我是路由中间件的首页路由";
});
//注:在KOA中如果需要在post响应中获取post请求的参数,需要下载koa-bodyparser
router.post("/aaa",async ctx=>{
    //koa-bodyparser插件获取post请求采用ctx.request.body
    console.log(ctx.request.body);//{ username: 'hhh' }
   ctx.body="我是post方法"; //用postman测试
});
app.use(bodyParser());//将koa-bodyparser插件绑定到koa应用中,注:如果在路由中使用了此中间件,那么应洋葱模型的先后先后顺序,需要先将此插件绑定到koa
app.use(router.routes());//可以使用routes()方法将路由中间件绑定到koa应用中
app.listen(1004);
KOA中的动态路由参数
const koa=require("koa");
const Router=require("koa-router");
const app=new koa;
const router=new Router();
router.get("/:username",ctx=>{
    //在KOA中获取冒号动态路由的参数,采用ctx.params
    ctx.body=ctx.params.username;
});
router.get("/:username-:pwd",ctx=>{//冒号传参的-连接符
    //在KOA中获取冒号动态路由的参数,采用ctx.params
    ctx.body=ctx.params;
});
router.get("/:username.:sex",ctx=>{//冒号传参.连接符
    //在KOA中获取冒号动态路由的参数,采用ctx.params
    ctx.body=ctx.params;
});
app.use(router.routes());
app.listen(1005);
KOA中的静态资源插件
const koa=require("koa");
const sourceStatic=require("koa-static");
const path=require("path");
const app=new koa;
//KOA中部署静态资源采用的插件koa-static,此插件直接部署静态资源的路径即可。
app.use(sourceStatic(path.join(__dirname,"public")));//注:KOA中,中间不能接路由
app.listen(1006);
拆分子路由
  • typeRouter.js
const Router=require("koa-router");
const router=new Router();
router.get("/api/type",ctx=>{
    ctx.body="我是中间件type";
})
module.exports=router;
  • userRouter.js
const Router=require("koa-router");
const router=new Router();
router.get("/api",ctx=>{
    ctx.body="我是子路由userRouter";
});
module.exports=router;
  • app.js
const koa=require("koa");
const app=new koa();
//注:在KOA中use方法不能接路由,所以直接引入子路由即可。
app.use(require("./router/userRouter").routes());//http://localhost:1007/api/type
app.use(require("./router/typeRputer").routes());//http://localhost:1007/api
app.listen(1007);
KOA的模板引擎EJS
  • views/index.ejs
<body>
    <% 
        let age=20;
        let htmlText=`<h1 style="color:red;">哈哈</h1>`; 
    %>
    <%= age %>
    <%-htmlText %><%#可以将HTML标签进行转义%>
    <%=htmlText %>
</body>
  • app.js
const koa=require("koa");
const views=require("koa-views");
const app=new koa();
//在KOA中使用EJS模板引擎
app.use(views("views",{extension:"ejs"}));
//在KOA中,如果需要采用ejs模板引擎,则必须要带async和await,如果不加则ejs模板无法响应
app.use(async ctx=>{
    await ctx.render("index");
})
app.listen(1008);
//Express中设置ejs模板引擎使用?
// app.engine("html",ejs.renderFile);//设置哪些文件支持ejs模板引擎默认ejs后缀,可以省略
// app.set("views",路径);//express的默认EJS路径文件夹views,默认可以省略
// app.set("view engine","ejs");//设置页面的后缀名
KOA中的cookie的使用
const koa=require("koa");
const Router=require("koa-router");
const app=new koa();
const router=new Router();
//在KOA中不需要引入任何插件,可以直接使用cookie.
router.get("/",ctx=>{
    ctx.cookies.set("username","rypy");//KOA中以键值对的形式来存cookie,使用方法ctx.cookies.set("键名",值)
    ctx.body="我是存cookies";
})
router.get("/getCookies",ctx=>{

    ctx.body=ctx.cookies.get("username");//KOA中取cookie,采用ctx.cookies.get("cookie的键名")
})
app.use(router.routes());
app.listen(1009);
KOA中使用session
const koa=require("koa");
const Router=require("koa-router");
const session=require("koa-session");
const app=new koa();
const router=new Router();
router.get("/",ctx=>{
    ctx.session.username="rypy";
    ctx.body="我是存session";
});
router.get("/getSession",ctx=>{
    ctx.body=ctx.session.username;
})
//注:在KOA中如果需要使用session,需要设定应用标识,即签名的cookie密钥数组,还要将session在方法内绑定给koa应用
//session()方法
//参数一是session的配置参数
//参数二是需要将session绑定给哪个应用,此处就填写哪个应用的实例
app.keys = ['koaText'];//设置签名cookie密钥数组。当KOA中使用Session必须设置密钥。
app.use(session({
    key: 'aaaa',//cookie钥匙,默认值是"koa.sess",
    maxAge: 86400000,//设置session的过期时间,
    autoCommit: true,//自动添加到header头部,默认值是true
    overwrite: true,//允许覆盖,默认值是true
    httpOnly: false, //仅支持http协议,默认值是true
    signed: true,//自带签名,默认值是true
    rolling: false,//是否支持重新写入过期时间,默认值是false
    renew: false, //设置session过期前是否自动重写,默认值是false
    //secure: true,//设置cookie名字。布尔类型。仅支持htpps://安全模式
    sameSite: null//session的cookie选项。
},app));//将session绑定给KOA应用,注:需要双向绑定,即除了采用use()方法绑定session以外,还需要在session的第二个参数中绑定应用。
// Force a session identifier cookie to be set on every response. The expiration is reset to the original maxAge, resetting the expiration countdown. 
app.use(router.routes());
app.listen(1010);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值