重学Node.js及其框架(Express, Koa, egg.js) 之 Koa框架(上)

简介: 重学Node.js及其框架(Express, Koa, egg.js) 之 Koa框架

总结自 Coderwhy的nodejs课程。


官网 koa.bootcss.com/#applicatio…


Koa的介绍


  • node.js的下一代web框架;


  • Koa旨在为Web应用程序和API提供更小、更丰富和更强大的能力;


  • 相对于express具有更强的异步处理能力;


  • Koa的核心代码只有1600+行,是一个更加轻量级的框架,我们可以根据需要安装和使用中间件;


Koa初体验


const Koa = require('koa');
    const app = new Koa();
    app.use((ctx, next) => {
      ctx.response.body = "Hello Koa";
    });
    app.listen(8000, () => {
      console.log("koa初体验服务器启动成功~");
    });


通过上面的例子,我们来介绍一下中间件中的两个参数。


  • ctx: 上下文(Context)对象;


  • koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性


  • ctx.req 为Node 的 request 对象.


  • ctx.res 为Node 的 response 对象.


  • ctx.response 为Koa 的 response 对象.


  • ctx.request 为Koa 的 request 对象.


  • next: 终止该中间件使用,调用下一个中间件。


Koa中使用中间件


Koa中注册中间件只能通过use()来注册,而且只能传递一个中间件,不能匹配路径。


app.use((ctx, next) => {
      ctx.response.body = "Hello Koa";
    });


使用路由


由于koa中未给我们提供路由处理,如果想要做复杂的路由匹配,我们就需要安装第三方库来帮助我们处理路由。 安装koa-router库。


注册路由


// users.js
    const Router = require('koa-router');
    const userRouter = new Router({prefix: "/users"});
    userRouter.get('/', (ctx, next) => {
      ctx.response.body = "User Lists~";
    });
    userRouter.put('/', (ctx, next) => {
      ctx.response.body = "put request~";
    });
    module.exports = userRouter;


使用路由


// index.js
    const Koa = require('koa');
    const userRouter = require('./router/user');
    const app = new Koa();
    app.use(userRouter.routes());
    app.use(userRouter.allowedMethods());
    app.listen(8000, () => {
      console.log("koa路由服务器启动成功~");
    });


从上面的例子可以看出


  • 当如路由文件,在app中将router.routes()注册为中间件


  • router.allowedMethods(): 他是用来判断我们设置了那些请求方法。如果只设置get请求,那么我们请求post,patch,delete等方法将会报错。Method Not Allowed,状态码:405;


解析请求传递的参数


解析params参数


我们直接通过ctx.request.params就可以获取到。当未使用路由时,他不会被解析。因为他不知道怎么解析,未给出解析对应的键名。


const Koa = require('koa');
    const app = new Koa();
    const Router = require('koa-router');
    const userRouter = new Router({ prefix: '/users' });
    // http://127.0.0.1:8000/users/9?name=zh&age=20
    userRouter.get('/:id', (ctx, next) => {
      console.log(ctx.request.url);
      console.log(ctx.request.params);
      console.log(ctx.request.query);
      /**
      * /users/9?name=zh&age=20
      *  { id: '9' }
      *  [Object: null prototype] { name: 'zh', age: '20' }
      */
    })
    app.use(userRouter.routes());
    app.listen(8000, () => {
      console.log("参数处理服务器启动成功~");
    });


解析query参数


我们直接通过ctx.request.query就可以获取到。


const Koa = require('koa');
    const app = new Koa();
    const Router = require('koa-router');
    const userRouter = new Router({ prefix: '/users' });
    // http://127.0.0.1:8000/users/9?name=zh&age=20
    userRouter.get('/:id', (ctx, next) => {
      console.log(ctx.request.url);
      console.log(ctx.request.params);
      console.log(ctx.request.query);
      /**
      * /users/9?name=zh&age=20
      *  { id: '9' }
      *  [Object: null prototype] { name: 'zh', age: '20' }
      */
    })
    app.use(userRouter.routes());
    app.listen(8000, () => {
      console.log("参数处理服务器启动成功~");
    });


解析请求中的json格式数据


Koa没有像Express中那样提供内置的中间件,所以我们需要使用第三方库koa-bodyparser解析。将解析后的参数放在ctx.request.body上。


const bodyParser = require('koa-bodyparser');
    app.use((ctx, next) => {
      console.log("body===json", ctx.request.body);
      ctx.response.body = "Hello World";
    });


解析请求中的x-www-from-urlencoded格式数据


Koa没有像Express中那样提供内置的中间件,所以我们需要使用第三方库koa-bodyparser解析。将解析后的参数放在ctx.request.body上。


const bodyParser = require('koa-bodyparser');
    app.use((ctx, next) => {
      console.log("body===json", ctx.request.body);
      ctx.response.body = "Hello World";
    });


解析请求中的form-data格式数据


他们的用法就等同于expres中的multer使用


我们需要安装koa-multer库来帮助我们解析。这个库和Express中解析文件数据差不多。不要将它作为全局中间件来使用,上传文件和非文件的form-data格式的数据,可能会产生冲突。并且它将数据挂载到的是nodejs中的request.body上的。通过ctx.req.body获取


github.com/koajs/multe…


解析非文件的表单数据


const Koa = require('koa');
    const Router = require('koa-router');
    const multer = require('koa-multer');
    const app = new Koa();
    const uploadRouter = new Router({prefix: '/upload'});
    const upload = multer();
    uploadRouter.post('/', upload.any(), (ctx, next) => {
      console.log(ctx.req.body);
      ctx.response.body = "解析成功~";
    });
    app.use(uploadRouter.routes());
    app.listen(8000, () => {
      console.log("koa初体验服务器启动成功~");
    });


解析文件的表单数据


我们可以指定上传的文件名和后缀。也可以上系统自动分配文件名。


const Koa = require('koa');
    const Router = require('koa-router');
    const multer = require('koa-multer');
    const app = new Koa();
    const uploadRouter = new Router({prefix: '/upload'});
    const uploadSingle = multer({
      dest: './uploads/avatar'
    });
    const uploadArray = multer({
      dest: './uploads/picture'
    });
    // 上传单个文件,而且他只能上传单文件。
    uploadRouter.post('/avatar', uploadSingle.single('avatar'), (ctx, next) => {
      console.log(ctx.req.file);
      ctx.response.body = "上传头像成功~";
    });
    // 上传多个文件
    uploadRouter.post('/picture', uploadArray.array('picture'), (ctx, next) => {
      console.log(ctx.req.files);
      ctx.response.body = "上传多文件成功~";
    });
    app.use(uploadRouter.routes());
    app.listen(8000, () => {
      console.log("koa初体验服务器启动成功~");
    });


网络异常,图片无法展示
|


网络异常,图片无法展示
|


相关文章
|
1月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
|
18天前
|
开发框架 JavaScript 中间件
node+express搭建服务器环境
node+express搭建服务器环境
node+express搭建服务器环境
|
18天前
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
14天前
|
开发框架 JavaScript 前端开发
【Node系列】Express 框架
Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,提供一系列强大的特性来帮助你创建各种 web 和移动设备应用。
33 2
|
14天前
|
JavaScript 前端开发 API
框架分析(3)-Vue.js
框架分析(3)-Vue.js
|
1月前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8的JavaScript运行时,用于服务器端编程。它的事件驱动、非阻塞I/O模型使其在高并发实时应用中表现出色,如Web服务器、实时聊天、API服务、微服务、工具和跨平台桌面应用(使用Electron)。适用于高性能和实时需求场景。
18 4
|
1月前
|
前端开发 JavaScript 机器人
详解《基于 javascript 的流程图编辑框架LogicFlow
详解《基于 javascript 的流程图编辑框架LogicFlow
72 0
|
1月前
|
JavaScript 前端开发 Serverless
函数计算新功能— 支持 Node.js 18 、Node.js 20 运行时
从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。
464 0
|
1月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
19 0
|
1月前
|
前端开发 JavaScript 开发者
编程笔记 html5&css&js 014 网页布局框架
编程笔记 html5&css&js 014 网页布局框架