koa框架的基本使用

227 阅读2分钟

简介

官方给的定义: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更加简洁,只包含最核心的功能。
  • 他们中间件的执行机制是不同的,特别是针对中间中包含异步操作时。