koa 介绍
NodeJS是一个异步的,官方的API支持的都是回调函数形式的编程模型,这样的设计会造成很多问题,比如回调的问题
koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
使用要求:Koa需要 node v7.6.0或更高版本来支持ES2015、异步方法
基本使用
安装
npm install –save koa
创建 app.js
// 引入koa
const Koa = require('koa');
const app = new Koa();
// 配置中间件
app.use(async ctx => {
ctx.body = 'Hello World';
});
// 监听端口
app.listen(3000);
koa 路由 koa-router
Koa的路由和express不同,express里面包含了路由的中间件,但是koa则没有,需要自己配置
npm地址:https://github.com/koajs/router/blob/HEAD/API.md
安装:npm install –-save koa koa-router
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/", (ctx,next) =>{
ctx.body = "koa-router"
})
app
.use(router.routes())//启动路由
.use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
Koa-router的get请求
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/xiaobai", (ctx,next) =>{
console.log(ctx)
})
app
.use(router.routes())//启动路由
.use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
router.get("/xiaobai", (ctx,next) =>{
console.log(ctx)
})
ctx的内容
console.log(ctx) //ctx 的内容
{
request: {
method: 'GET',
url: '/xiaobai',
header: {
host: '127.0.0.1:3000',
connection: 'keep-alive',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
'sec-ch-ua-mobile': '?0',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'none',
'sec-fetch-mode': 'navigate',
'sec-fetch-user': '?1',
'sec-fetch-dest': 'document',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9'
}
},
response: {
status: 404,
message: 'Not Found',
header: [Object: null prototype] {}
},
app: { subdomainOffset: 2, proxy: false, env: 'development' },
originalUrl: '/xiaobai',
req: '<original node req>',
res: '<original node res>',
socket: '<original node socket>'
}
路由参数
动态路由
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/class/:name/:age/:sex/:height", (ctx,next) =>{
console.log(ctx.params);
})
app
.use(router.routes())//启动路由
.use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
动态路由 完全匹配的问题
设置动态路由的时候只设置了几级,此时会遇到捕获不到的请情况,如果想匹配任何可以使用通配(.*)
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/class/:name/:age/:sex/:height/(.*)", (ctx,next) =>{
console.log(ctx.params);
})
app
.use(router.routes())//启动路由
.use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
如果使用通配,则后面就不应该由其他的动态捕获,因为*会抓取所有
Koa使用ejs模板引擎
koa 这里和express 一样使用 ejs 模板引擎
配置模板引擎的相关依赖
npm install --save ejs koa-views
const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const app = new Koa();
const router = new Router();
router.get("/", async (ctx) =>{
//渲染模板引擎为index.ejs
await ctx.render("index")
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
extension:"ejs"
}))
app
.use(router.routes())//启动路由
.use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
koa-router POST 请求
post请求在获取参数的时候仅仅依靠koa-router是不行的,还需要安装koa-bodyparser,来获取post请求的参数
const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const bodyparser = require("koa-bodyparser")
const app = new Koa();
const router = new Router();
router.get("/", async (ctx) =>{
//渲染模板引擎为index.ejs
await ctx.render("index")
})
router.post("/addForm",(ctx) => {
console.log(ctx.request.body)
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
extension:"ejs"
}))
//
app.use(bodyparser());
app
.use(router.routes())//启动路由
.use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
koa 文件静态化
koa中使用的是koa-static来静态文件资源
安装 npm install --save koa-static
const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const bodyparser = require("koa-bodyparser")
const static = require("koa-static")//静态化
const app = new Koa();
const router = new Router();
router.get("/", async (ctx) =>{
//渲染模板引擎为index.ejs
await ctx.render("index")
})
router.post("/addForm",(ctx) => {
console.log(ctx.request.body)
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
extension:"ejs"
}))
//post请求
app.use(bodyparser());
//静态化
app.use(static(__dirname + "/assets"))
app
.use(router.routes())//启动路由
.use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
console.log("监听3000")
})
const static = require("koa-static")//静态化
app.use(static(__dirname + "/assets"))