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

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

响应请求


其他方法请访问官网: koa.bootcss.com/#response


  • response.body: 用来响应请求的数据。


  • string :字符串数据


  • Buffer :Buffer数据


  • Stream :流数据


  • Object || Array:对象或者数组


  • null :不输出任何内容


  • 如果response.status尚未设置,Koa会自动将状态设置为200或204。


  • response.type: 设置 Content-Type字段


  • response.set: 设置响应头字段。可以传入一个对象或者传入key, value


  • response.status: 设置状态码。


app常用方法和属性


  • app.context。可以通过编辑 app.contextctx 添加其他属性。


app.context.db = db();
    app.use(async ctx => {
      console.log(ctx.db);
    });


  • app.keys。设置cookie的签名


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


// 这个值为数组
app.keys = ['im a newer secret'];
// 这些密钥可以倒换,并在使用 `{ signed: true }` 参数签名 Cookie 时使用。
ctx.cookies.set('name', 'tobi', { signed: true });


ctx常用方法和属性


  • ctx.cookies.set(name, value, [options]): 设置cookie


  • ctx.cookies.get(name, [options]): 获取cookie


  • ctx.get(): 获取请求头中的字段名


  • ctx.body: ctx.response.body的别名。返回响应内容。


  • ctx.status: ctx.response.status的别名。返回或者设置状态码。


  • ctx.type:  ctx.response.type的别名。返回或者设置返回值类型。


  • ctx.set(): ctx.response.set的别名。设置响应头字段。可以设置多个字段或者单个字段


ctx.set('Cache-Control', 'no-cache');
    ctx.set({
      'Etag': '1234',
      'Last-Modified': date
    });


ctx.request对象中的简写


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


ctx.response对象中的简写


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


部署静态服务器


Koa中没有像Express中内置的中间件,需要安装第三方koa-static库。


const Koa = require('koa');
    const koaStatic = require('koa-static');
    const path = require("path")
    const app = new Koa();
    app.use(koaStatic(path.resolve(__dirname, "./static")));
    app.listen(8000, () => {
      console.log("koa初体验服务器启动成功~");
    });


错误处理


官方可是说过有力地增强错误处理。


通过ctx.app.emit("error", 错误类型, ctx)传递错误。


通过app.on("error", (err, ctx) => {})监听错误,并做出处理。


自定义错误类型


// 用户名或者密码未输入
    const USERNAME_OR_PASSWORD_NOT_INPUT = "username_or_password_not_input"
    // 用户名重复
    const USER_ALREADY_EXISTS = 'user_already_exists';
    // 用户名错误
    const USERNAME_NOT_EXISTS = 'username_not_exists';
    // 密码错误
    const PASSWORD_ERROR = 'password_error'
    // 未携带授权token
    const NOT_TAKE_AUTHORIZATION_TOKEN = "not_take_authorization_token"
    // 未授权
    const UNAUTHORIZATION = 'unauthorization'
    // 用户没有权限
    const NOT_PERMISSION = 'not_permission'
    module.exports = {
      USERNAME_OR_PASSWORD_NOT_INPUT,
      USER_ALREADY_EXISTS,
      USERNAME_NOT_EXISTS,
      PASSWORD_ERROR,
      NOT_TAKE_AUTHORIZATION_TOKEN,
      UNAUTHORIZATION,
      NOT_PERMISSION
    }


处理错误的中间件函数


// errorHandle.js
    const {
      USERNAME_OR_PASSWORD_NOT_INPUT,
      USER_ALREADY_EXISTS,
      USERNAME_NOT_EXISTS,
      PASSWORD_ERROR,
      NOT_TAKE_AUTHORIZATION_TOKEN,
      UNAUTHORIZATION,
      NOT_PERMISSION
    } = require("./errorType");
    const errorHandle = (errorMessage, ctx) => {
      let status, message;
      switch (errorMessage) {
        case USERNAME_OR_PASSWORD_NOT_INPUT:
          status = 400; // Bad Request
          message = "用户名或者密码不能为空~";
          break;
        case USER_ALREADY_EXISTS:
          status = 409; // conflict
          message = "用户名已经存在~";
          break;
        case USERNAME_NOT_EXISTS:
          status = 400; // 参数错误
          message = "用户名不存在~";
          break;
        case PASSWORD_ERROR:
          status = 400; // 参数错误
          message = "密码是错误的~";
          break;
        case NOT_TAKE_AUTHORIZATION_TOKEN:
          status = 401; // 参数错误
          message = "未携带token~";
          break;
        case UNAUTHORIZATION:
          status = 401; // 参数错误
          message = "无效的token~";
          break;
        case NOT_PERMISSION:
          status = 401; // 参数错误
          message = "您不具备操作的权限~";
          break;
        default:
          status = 404;
          message = "NOT FOUND";
      }
      ctx.status = status;
      ctx.body = message;
    }
    module.exports = errorHandle


注册错误中间件


const errorHandle = require("./errorHandle");
    app.on("error", errorHandle)


Koa的源码分析


我们调用 new Koa()其实就是在内部调用Application类的构造函数。其中有一个middleware的数组用于存储中间件。


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


我们通过app.listen()来开启服务,底层其实就是调用nodejs中的listen方法


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


注册中间件时,调用use方法将中间件加入到middleware数组中。


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


通过调用callback函数来返回响应


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


并且通过compose函数来处理中间件的调用


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


处理完中间件后,我们将中间件传入到handleRequest函数中,来做出响应。


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


Express和Koa的区别


从架构设计上来说:


  • express是完整和强大的,其中帮助我们内置了非常多好用的功能;


  • koa是简洁和自由的,它只包含最核心的功能,并不会对我们使用其他中间件进行任何的限制。甚至是在app中连最基本的get、post都没有给我们提供;我们需要通过自己或者路由来判断请求方式或者其他功能;


中间件执行的差异


express和koa框架他们的核心其实都是中间件:它们的中间件的执行机制是不同的,特别是针对某个中间件中包含异步操作时;


所以,接下来,我们再来研究一下express和koa中间件的执行顺序问题;


情景介绍


  • 在middleware1中,在req.message中添加一个字符串 aaa;


  • 在middleware2中,在req.message中添加一个 字符串bbb;


  • 在middleware3中,在req.message中添加一个 字符串ccc;


  • 当所有内容添加结束后,在middleware1中,通过res返回最终的结果; express的中间件没有在异步操作中拼接字符串,然后在第一个中间件中返回响应结果req.message。将会是aaabbbccc。如果有异步操作拼接字符串(假设ccc在异步操作中拼接的), 那么将会返回aaabbb。这是因为express调用中间件的时候,执行到最后一个中间件时,他不会等待异步操作执行完毕。就会返回到上一个中间件未执行完的代码。


Koa的中间件中执行同步拼接的时候,产生的结果和express相同。我们可以通过将中间件设置为async函数,来让next()后的代码异步操作,就可以正确返回aaabbbccc。


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


相关文章
|
15天前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
【4月更文挑战第24天】Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它包含中间件系统用于日志、错误处理和静态文件服务,集成多种模板引擎如EJS、Jade、Pug。框架还提供安全中间件提升应用安全,并具有良好的可扩展性,便于项目功能扩展和开发效率提升。
25 3
|
17天前
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
38 0
|
12天前
|
JavaScript 前端开发 持续交付
【专栏】构建现代Web应用:Vue.js与Node.js的完美结合
【4月更文挑战第27天】本文探讨了Vue.js和Node.js如何结合构建现代Web应用。Vue.js作为轻量级前端框架,以其简洁易懂、组件化开发、双向数据绑定和虚拟DOM等特点受到青睐;而Node.js是高性能后端平台,具备事件驱动、非阻塞I/O、丰富生态系统和跨平台优势。两者结合实现前后端分离,高效通信,并支持热更新、持续集成、跨平台和多端适配,为开发高性能、易维护的Web应用提供强有力的支持。
|
1天前
|
JavaScript 前端开发
JS实现网页页面的框架(demo)
JS实现网页页面的框架(demo)
6 1
|
7天前
|
设计模式 前端开发 JavaScript
AngularJS是一款由Google收购的JavaScript结构框架
AngularJS是Google收购的JavaScript框架,用于构建动态Web应用,基于MVC模式,强调模块化和双向数据绑定。它简化了视图与模型的同步,通过语义化标签和依赖注入提升开发效率。适用于复杂单页面应用(SPA),但不适合DOM操作密集型或性能要求极高的场景。
17 0
|
9天前
|
JavaScript 前端开发 IDE
【JavaScript与TypeScript技术专栏】TypeScript在JavaScript库与框架开发中的作用
【4月更文挑战第30天】TypeScript,微软开发的JavaScript超集,以其强类型和面向对象特性,正成为提升Web项目质量和效率的关键工具,尤其在库和框架开发中。它通过类型系统减少运行时错误,提供内置文档,便于重构,增强IDE支持,以及支持模块化。流行框架如React、Angular已支持TypeScript,未来有望成为开发高质量库和框架的标准语言。随着社区增长,TypeScript将在Web开发领域扮演更重要角色。
|
9天前
|
JavaScript 前端开发 开发工具
【JavaScript 技术专栏】Node.js 基础与实战
【4月更文挑战第30天】本文介绍了Node.js的基础及应用,包括事件驱动的非阻塞I/O、单线程模型和模块系统。内容涵盖Node.js的安装配置、核心模块(如http、fs、path)及实战应用,如Web服务器、文件操作和实时通信。文章还讨论了Node.js的优劣势、与其他技术的结合,并通过案例分析展示项目实施流程。总结来说,Node.js是高效后端开发工具,适合构建高并发应用,其广阔的应用前景值得开发者探索。
|
9天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
9天前
|
开发框架 JavaScript 中间件
深入探索Node.js的Express框架:使用与中间件详解
【4月更文挑战第30天】本文深入探讨了Node.js的Express框架,介绍了其作为Web开发的强大工具,主要聚焦于基本使用和中间件。Express是基于Node.js的Web应用框架,用于构建高效的应用和API。文章详细讲解了如何安装Express,创建简单应用,以及中间件的工作原理和应用,包括中间件的顺序、错误处理和挂载位置。此外,还提到了使用第三方中间件扩展功能。理解Express基础和中间件对于开发高质量Web应用至关重要。
|
10天前
|
JavaScript 前端开发 开发者
前端框架(Vue.js&&vue-cli项目框架&&element-ui使用)
前端框架(Vue.js&&vue-cli项目框架&&element-ui使用)