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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 重学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初体验服务器启动成功~");
    });


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


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


相关文章
|
20天前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
17天前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
32 1
|
20天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
36 4
|
22天前
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
15天前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
31 0
|
15天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
17天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
24 0
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
30 2