Node.js第十一篇:Koa框架基础

编程

Koa 学习网站:https://koa.bootcss.com

1.2-Koa和Express的区别

Koa和Express都是NodeJS的主流应用开发框架。

Express是一个完整的nodejs应用框架。Koa是由Express团队开发的,但是它有不同的关注点。Koa致力于核心中间件功能。nodejs中间件是访问请求对象(req)和响应对象(res)的例程。这些例程在路由处理程序之前被调用,因此它们位于客户端与生成响应的路由逻辑的“中间”。nodejs应用程序可以将中间件例程“链接”到自定义请求/响应管道中。管道可以根据请求和响应进行操作,包括头和主体。Express和Koa都包含中间件,但实现方法却截然不同。

核心Koa模块只是中间件内核。而Express包含一个完整的应用程序框架,具有路由和模板等功能。Koa确实有这些功能的选项,但它们是单独的模块。因此,Koa的模块化程度更高;您只需包含所需的模块即可。核心KOA模块只有大约2千行代码,因此,如果您只需要核心请求应答上下文对象,则Koa占用空间非常小。相比较而言,Express较为庞大,内置了一整套中间件功能,好处是对于大部分应用场合你可以省掉自己选择和组合模块的时间。

Koa对Express进行了扩展,并充分利用了ES7新的语法。Koa的Context对象是对Express核心请求和应答对象的扩展,另外利用async/await来消除回调(callback)陷阱。

1.3-第一个koa框架程序

Node.js环境

开发 Koa2 之前,Node.js 是有要求的,它要求 Node.js 版本高于 V7.6。因为 node.js 7.6 版本 开始完全支持 async/await,所以才能完全你支持我们的 Koa2。

安装koa

npm install --save koa

简单使用

// 导入koa模块

const koa = require("koa")

// 创建koa服务

const app = new koa()

// 监听请求

app.use(async (cx) => {

cx.body = "hello koa"

})

// 设置端口,开启监听

app.listen(80)

第二章:Koa路由模块

2.1-概述

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。

通俗的讲:路由就是根据不同的 URL 地址,加载不同的页面实现不同的功能。

2.2-安装和使用路由模块

Koa 中的路由和 Express 有所不同,在 Express 中直接引入 Express 就可以配置路由,但是在 Koa 中我们需要安装对应的 koa-router 路由模块来实现。

npm install koa-router --save

代码演示

const koa = require("koa")

// 【导入路由模块】

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

const app = new koa()

router.use("/news", async (ctx) => {

ctx.body = "新闻列表"

})

// 注册路由

app.use(router.routes())

// 作用: 这是官方文档的推荐用法,我们可以 看到 router.allowedMethods()用在了路由匹配 router.routes()之后,所以在当所有 路由中间件最后调用.此时根据 ctx.status 设置 response 响应头

app.use(router.allowedMethods());

app.listen(80)

2.3-get请求和请求参数

格式:router.get()

获取请求参数:

  • ctx.request.query 返回对象格式
  • ctx.request.querystring 返回字符串格式
  • ctx.query 返回对象格式
  • ctx.querystring 返回字符串格式

代码演示

const koa = require("koa")

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

const app = new koa()

// 【获取get请求参数】

router.get("/news", async (ctx) => {

const url = cx.url

// 从request对象中获取参数

const req_query = ctx.request.query

const req_querystring = ctx.request.querystring

// 从cx上下文中直接获取

const ctx_query = ctx.query

const ctx_querystring = ctx.querystring

ctx.body = {

url,

req_query,

req_querystring,

cx_query,

cx_querystring

}

})

app.use(router.routes())

app.use(router.allowedMethods());

app.listen(80)

2.4-post请求和请求参数

格式

router.post()

原生方式获取post请求参数

const koa = require("koa")

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

const app = new koa()

// 封装获取post数据

let getPostData = (ctx) => {

return new Promise(function (resolve, reject) {

try {

let str = "";

ctx.req.on("data", function (chunk) {

str += chunk;

})

ctx.req.on("end", function (chunk) {

resolve(str)

})

} catch (err) {

reject(err)

}

})

}

// 处理post请求

router.post("/news", async (ctx, next) => {

const data = await getPostData(ctx);

console.log(data); // 输出结果:username=admin&password=123456

ctx.body = "ok"

})

app.use(router.routes())

app.use(router.allowedMethods());

app.listen(80)

koa-bodyparser模块简化操作post请求数据

安装:npm i koa-bodyparser --save

代码:

const koa = require("koa")

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

// 导入body-parser,简化获取post请求参数

const bodyparser = require("koa-bodyparser")

const app = new koa()

// 【获取post请求参数】

router.post("/news", async (cx) => {

// 获取post请求参数

const params = cx.request.body

cx.body = {

params

}

})

// 注册body-parse

app.use(bodyparser())

app.use(router.routes())

app.use(router.allowedMethods());

app.listen(80)

2.5-动态参数获取方式

const koa = require("koa")

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

const app = new koa()

// 【获取动态路由数据】 例如::id 就是动态参数

router.get("/news/:id", async (cx) => {

const params = cx.params

cx.body = params

})

// 请求:http://localhost/news/1

// 返回结果:{"id":"1"}

app.use(router.routes())

app.use(router.allowedMethods());

app.listen(80)

2.6-Koa请求错误处理

const koa = require("koa")

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

const app = new koa()

router.get("/news", async (ctx) => {

ctx.body = "ok"

})

// 请求错误处理中间件

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

await next()

if (ctx.status == 404) {

ctx.status = 404

ctx.body = "这个页面不存在!"

}

})

app.use(router.routes())

app.use(router.allowedMethods());

app.listen(80)

2.7-开放静态资源

安装模块-koa-bodyparser

npm install koa-bodyparser --save

代码演示

const koa = require("koa")

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

const path = require("path")

// 导入静态资源处理模块

const static = require("koa-static")

const app = new koa()

app.use(bodyparser())

app.use(router.routes())

app.use(router.allowedMethods());

// 配置静态资源路径

app.use(static(path.join(__dirname,"./public")))

router.get("/news", async (ctx) => {

ctx.body = "ok"

})

app.listen(80)

第三章:Koa中使用ejs模板引擎

安装 koa-views 和 ejs

  1. 安装 koa-views: npm install --save koa-views
  2. 安装 ejs: npm install ejs --save>

koa中配置

服务器程序代码

const koa = require("koa")

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

const path = require("path")

// 导入koa-views模块

const views = require("koa-views");

const app = new koa()

// 配置模板引擎中间件 --第三方中间件

// views("模板路径", { map: {html: "ejs" }}))

//app.use(views("views", { map: {html: "ejs" }})); //这样配置也可以 注意如果这样配置的话 模板的后缀名是.html

app.use(views("views",{

extension:"ejs" /*应用ejs模板引擎*/

}))

// 使用模板引擎

router.get("/list", async (ctx) => {

await ctx.render("list", {

title: "<h1>列表页面</h1>"

})

})

// 注意:中间件的执行是有顺序的,路由在前,然后模板引擎在后的话,当执行到ctx.render的时候,模板引擎相关的中间件还未执行,render方法还未绑定到ctx上,所以就会报ctx.render is not a function

app.use(router.routes())

app.use(router.allowedMethods())

app.listen(80)

模板引擎代码-list.ejs

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

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

<title>Document</title>

</head>

<body>

<!-- 导入其他ejs模板 -->

<%-include("./header.ejs")%>

<!-- Ejs 绑定数据 -->

<%=title%>

<!-- Ejs 绑定 html 数据 -->

<%-title%>

<!-- 判断 -->

<%if(true){%>

<h2>ok</h2>

<%}%>

<!-- 循环 -->

<%for(var i = 0; i < 10; i++){%>

<%=i%>

<%}%>

</body>

</html>

第四章:Koa中使用art-template

4.1-概述

art-template 是一个简约、超快的模板引擎。 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同时支持 NodeJS 和浏览器。

4.2-安装和使用

安装

npm install --save art-template

npm install --save koa-art-template

使用

服务端程序导入和配置

const koa = require("koa")

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

const path = require("path")

// 导入koa-art-template模块

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

const app = new koa()

// 配置模板引擎中间件 --第三方中间件

render(app, {

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

extname: ".art",

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

});

// 使用模板引擎

router.get("/list", async (ctx) => {

await ctx.render("list2", {

title: "<h3>列表页面</h3>"

})

})

// 注意:中间件的执行是有顺序的,路由在前,然后模板引擎在后的话,当执行到ctx.render的时候,模板引擎相关的中间件还未执行,render方法还未绑定到ctx上,所以就会报ctx.render is not a function

app.use(router.routes())

app.use(router.allowedMethods())

app.listen(80)

模板引擎代码:list2.art

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

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

<title>Document</title>

</head>

<body>

<h2>art-template模板引擎</h2>

// 输出内容

{{title}}

// 输出内容(解析html)

{{@title}}

</body>

</html>

第五章:Koa中操作cookie

const koa = require("koa")

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

const app = new koa()

// 登录-设置cookie

router.get("/login", async (ctx) => {

ctx.cookies.set("username", "admin", {

maxAge:60*1000 // 有效时间

})

// 设置中文的值-需要转码

ctx.cookies.set("gender",new Buffer("男").toString("base64"))

ctx.body = "ok"

})

// 首页-读取cookie

router.get("/index2", async (ctx) => {

const val = ctx.cookies.get("username")

const val2 = ctx.cookies.get("gender")

ctx.body = "cookie:" + val + "--" + (new Buffer(val2,"base64").toString());

})

app.use(router.routes())

app.use(router.allowedMethods())

app.listen(80)

第六章:Koa中操作session

安装koa-session模块:npm install koa-session

const koa = require("koa")

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

// 导入koa-session模块

const session = require("koa-session")

const app = new koa()

// 配置session

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

const CONFIG = {

key: "koa:sess", //cookie key (default is koa:sess)

maxAge: 86400000, // cookie 的过期时间 maxAge in ms (default is 1 days)

overwrite: true, //是否可以 overwrite (默认 default true)

httpOnly: true, //cookie 是否只有服务器端可以访问 httpOnly or not (default true)

signed: true, //签名默认 true

rolling: false, //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)

renew: false, //(boolean) renew session when session is nearly expired,

};

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

app.use(router.routes())

app.use(router.allowedMethods())

// 设置session

router.get("/login", async (ctx) => {

ctx.session.username = "张三";

ctx.body = "ok"

})

// 获取session

router.get("/index3", async (ctx) => {

ictx.body = "username:" + ctx.session.username

})

// 销毁session

router.get("/destroy", async (ctx) => {

ctx.session = null

ctx.body = "ok"

})

app.listen(80)

第七章:Koa项目基本架构

链接:https://pan.baidu.com/s/1cK4BMDaSe59H84KY6-y5RA

提取码:64mj

以上是 Node.js第十一篇:Koa框架基础 的全部内容, 来源链接: utcz.com/z/516387.html

回到顶部