简介
官方给的定义:koa基于Node.js平台的下一代web开发框架。
它是由Express原版人马打造的。致力于成为一个更小、更富有表现力、更健壮的web框架。
创建服务器
const Koa = require("koa");
// 创建服务器
const app = new Koa();
// 使用中间件
app.use((ctx,next)=>{
ctx.body = "hello koa";
next();
})
// 启动服务器
app.listen(8888,()=>{
console.log('koa服务器启动成功~')
})
content(上下文)
koa context将node的request和response对象封装在一个单独的对象(ctx)里面。context在每个request请求中被创建。
app.use(ctx=>{
ctx; // is the content
ctx.request; // is a koa request
ctx.response; // is a koa response
});
- koa将request和response分开,而是将它们作为ctx的属性;
- ctx代表一次请求的上下文对象;
- ctx.request:获取请求对象;
- ctx.response:获取响应对象;
koa中间件
koa注册中间件只能通过use方法
app.use((ctx,next)=>{
console.log(ctx.query);
next();
})
托管静态资源
使用第三方库
npm install koa-static
const static = require("koa-static");
app.use(static("./build"));
参数解析:json
使用body-parser中间件
npm install koa-bodypaerser
const bodyParser = require('koa-bodyparser');
app.use(bodyParser);
ap.use((ctx,next)=>{
console.log(ctx.request.body);
ctx.body = "hello";
})
文件上传
使用multer中间件
npm install @koa/multer
const KoaRouter = require('@koa/router')
const multer = require('@koa/multer')
const storage = multer({
storage: multer.diskStorage({
destination: (req,file,cb)=>{
cb(null,"./uploads")
},
filename: (req,file,cb)=>{
cb(null,Date.now() + path.extname(file.originalname))
}
})
});
const fileRouter = new Router();
fileRouter.post("/upload",upload.single("avatar"),(ctx,next)=>{
console.log(ctx.request.file)
ctx.body = '文件上传成功~'
})
错误处理
app.use((ctx,next)=>{
ctx.app.emit("error",new Error("报错"),ctx); // 发出错误
});
app.on("error",(err,ctx)=>{ // 添加一个“错误”监听器来处理错误
console.log(err.message);
})
路由
koa并没有内置路由的库,我们可以选择第三方库: koa-router
npm install @koa/router
为了方便对路由进行管理,我们将统一类的路由抽离为一个模块。比如:
// user.router.js
const koaRouter = require("@koa/router")
// 1.创建路由对象
const userRouter = new KoaRouter({ prefix: '/users' });
userRouter.get("/",(ctx,next)=>{ctx.body = "用户列表~"});
module.exports = userRouter;
// app.js
const userRouter = requre("./router/user.router.js");
app.use(userRouter.routes());
app.use(userRouter.allowedMethods());
注意:allowedMethods用于判断某一个method是否支持:
- 如果我们请求get,那是正常的请求,因为我们有实现get;
- 如果我们请求post、put等,会自动报错:Method Not Allowed,状态码: 405;
参数解析:params和query
query参数
router.get("/login",(ctx,next)=>{
console.log(ctx.query);
ctx.body = "hello world";
})
params
router.get("/login/:id",(ctx,next)=>{
console.log(ctx.params.id);
ctx.body = "hello world";
})
响应数据
-
输出结果
string,Buffer,Stream,Object,Array,null;
-
响应状态码
如果response.status尚未设置,Koa会自动将状态设置为200或204;
与express的区别
- 从架构上设计来说,express比较强大,内置了很多好用的功能;koa更加简洁,只包含最核心的功能。
- 他们中间件的执行机制是不同的,特别是针对中间中包含异步操作时。