目录
1. koa介绍
- koa是express原班人马打造的轻量、健壮、富有表现力的nodejs框架;
- 目前koa有koa1和koa2两个版本;koa2依赖Node.js 7.6.0或者更高版本;
- koa不在内核方法中绑定任何中间件,它仅仅是一个轻量级的函数库,几乎所有功能都必须通过第三方插件来实现。
2. koa的使用
2-1. 创建简单的服务器
- Koa 利用中间件 控制"上游",调用"下游“;
- ctx -> context 上游或者下游的对象;
- req == ctx.req; res = ctx.res;
- 封装了req和res : ctx.request和ctx.response
const Koa = require("koa");
const app = new Koa();
app.use((ctx,next)=>{
// ctx.response.body
ctx.body = "你好";
});
app.listen(3000);
-
koa是包含一组中间件函数的对象;可以将app.use里的函数理解成中间件;
-
通过next()将控制转交给另一个中间件
-
执行顺序:洋葱模型
const Koa = require("koa");
const app = new Koa();
let middleWare1 = async (ctx,next)=>{
console.log("first start");
ctx.body = "hello world_1";
next();
console.log("first end");
}
let middleWare2 = async (ctx,next)=>{
console.log("second start");
ctx.body = "hello world_2";
console.log("second end");
}
app.use(middleWare1);
app.use(middleWare2);
app.listen(3000);
>first start
>second start
>second end
>first end
2-2. 接收浏览器请求地址
- 请求地址
http://localhost:3000/?name=zhangsan
- 未封装前
const url = require("url");
let objUrl = url.parse(ctx.req.url,true)
console.log(objUrl.query);
- 封装后
console.log(ctx.request.query.name);
const Koa = require("koa");
const app = new Koa();
app.use((ctx,next)=>{
ctx.body = "你好";
console.log(ctx.request.query.name);
});
app.listen(3000);
> zhangsan
3. Application对象
- application是koa的实例,简写app
- app.use 将给定的中间件方法添加到此应用程序,分为同步和异步,异步:通过es7中的async和await来处理
- app.listen设置服务器端口
- app.on 错误处理
// 错误处理中间件
app.on("error",err=>{
console.log(err);
})
4. request及response别名
4-1. request别名
【koa会把ctx.requset上的属性直接挂载到ctx上】
ctx.header
//头信息;ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
- …
4-2. response别名
【同样也会把ctx.response上的属性直接挂载到ctx上】
ctx.body
ctx.body=
ctx.status
ctx.status=
- …
5. 常见http状态码
- http状态码:1xx(消息)、2xx(成功)、3xx(重定向)、4xx(请求错误)、5xx和6xx(服务器错误)
HTTP状态码 | 描述 |
---|---|
100 | 继续。继续响应剩余部分,进行提交请求 |
200 | 成功 |
301 | 永久移动。请求资源永久移动到新位置 |
302 | 临时移动。请求资源零时移动到新位置 |
304 | 未修改。请求资源对比上次未被修改,响应中不包含资源内容 |
401 | 未授权,需要身份验证 |
403 | 禁止。请求被拒绝 |
404 | 未找到,服务器未找到需要资源 |
500 | 服务器内部错误。服务器遇到错误,无法完成请求 |
503 | 服务器不可用。零时服务过载,无法处理请求 |
6. koa常用中间件介绍
6-1. koa-router
- 路由是引导匹配之意,是匹配url到相应处理程序的活动。
- Koa-router推荐使用RESTful架构API
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/", async (ctx, next) => {
ctx.body = "你好";
// 重定向
ctx.redirect("/index");
});
router.get("/index", async (ctx, next) => {
ctx.body = "主页";
});
router.get("/detail", async (ctx, next) => {
ctx.body = "详细页面";
});
// 请求方式:get:获取 post:添加 put:更新 delete:删除
router.all("/getData/:id", async (ctx, next) => {
ctx.body = {
name: "张三",
age: 20
};
console.log(ctx.params.id)
})
app.use(router.routes());
app.listen(3000);
6-2. koa-views
- 用于加载html模板文件
- 加载模板引擎pug的例子
const Koa = require("koa");
const Router = require("koa-router");
// 视图管理模块,用于加载模板
const views = require("koa-views");
let app = new Koa();
let router = new Router();
app.use(views(__dirname + "/views",{
map: {
html: "pug"
}
}))
router.get("/", async ctx => {
// render():服务端在响应 http 请求的时候调用 res.render({options}) 去向模板中渲染数据, 可以把视图响应给客户端.
// 渲染加载模板需要时间,所以是异步
await ctx.render("index.pug");
});
app.use(router.routes());
app.listen(3000);
6-3. koa-static
- 是用于加载静态资源的中间件,通过它可以加载css、js等静态资源;
- 注:若端口号为8888,则由于
app.use(static(__dirname+"/static"))
使得目前端口号8888对应的文件夹为__dirname+"/static"
,则此时加载静态文件a.js
的index.js页面引入静态文件只需要<script src="a.js"></script>
const static = require("koa-static");
app.use(static(__dirname+"/static")) //加载静态文件的目录