重学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初体验服务器启动成功~");
    });


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


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


相关文章
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
639 1
|
10月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
Web App开发 缓存 监控
如何解决Node框架中内存管理的挑战?
解决 Node 框架中内存管理的挑战需要综合运用多种方法,并且需要在开发过程中保持谨慎和细心,不断优化和改进代码。同时,定期进行内存管理的检查和维护也是非常重要的。
517 160
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
1416 9
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
398 9
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
JavaScript
NodeJS 实践:利用Node Async 解决 Callback Hell
在两年前的一个 MEAN 技术栈项目中曾经有过这样的一段的代码... Callback Hell 代码片段 UserLogin.findOne({email:email}) .populate({ path: 'toParty', select: 'fullname roleTypes'
3350 0
|
12月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
3685 11