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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 重学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
node 框架
Node 框架以其独特的优势和广泛的应用场景,成为了现代 Web 开发中不可或缺的一部分。掌握 Node 框架的开发技能,对于开发者来说具有重要的意义。
104 59
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
1月前
|
Web App开发 缓存 监控
如何解决Node框架中内存管理的挑战?
解决 Node 框架中内存管理的挑战需要综合运用多种方法,并且需要在开发过程中保持谨慎和细心,不断优化和改进代码。同时,定期进行内存管理的检查和维护也是非常重要的。
114 63
|
1月前
|
安全 前端开发 JavaScript
Node框架的优缺点
Node 框架的优点使其在现代 Web 开发中具有重要地位,但同时也需要开发者在使用过程中注意其缺点,合理选择和应用,以充分发挥其优势,避免潜在问题的出现。随着技术的不断发展和完善,Node 框架也在不断改进和优化,以更好地适应各种应用需求。
90 47
|
21天前
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
46 9
|
1月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
1月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
100 2
|
1月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。