从零开始搭建实战级Nodejs服务项目 —— 2. 洋葱模型

2023-12-02 12:10

本文主要是介绍从零开始搭建实战级Nodejs服务项目 —— 2. 洋葱模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

focus

前言

ExpressKoa 基本上是我们最熟悉的开发框架。

我们在这里选用 Koa2 ,不仅仅是因为它是由 Express 原班人马打造的下一代Web开发框架, 更是因为它遵循的“洋葱模型”。且在 koa2 中使用 Promise, 因此可以结合 async/await 编写出更易于理解与维护的代码,更符合 Node.js 的开发习惯。

那么,到底什么是“洋葱模型”呢?我们从AOP讲起。

AOP 面向切面编程

AOP(Aspect Oriented Programming)通过预编译方式和运行期间动态代理实现程序功能的 统一维护 的一种技术。

简单来说,AOP利用一种称为"横切"的技术,将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

特点:低耦合,高聚合。

洋葱模型

如果我们想要穿透一个洋葱,就需要先穿过一层一层的洋葱皮,到达洋葱核心,再从核心穿过洋葱皮到达另一边。

洋葱的每一层皮,对应的就是一个中间件,其生命周期大致有:

  • 进入中间件
  • 前期处理
  • 等待下游中间件处理完成
  • 后期处理
  • 离开中间件

多个中间件组合就形成了一个洋葱,由 requestresponse 就形成了一次穿透,这就形成了洋葱模型

宏观上来说,Koa本身只是一个遵循洋葱模型的中间件管理器,不与任何的中间件绑定。再利用 koa-static koa-bodyparser koa-router 等插件以中间件形式加载。形成最基本的http框架。

对于Web应用而言,一次Http请求通常包含很多工作,如Cookie处理、ip过滤、权限验证、异常处理、记录日志等,这些基础方法都可以以中间件形式加载在Koa框架上。隔离与业务逻辑之间的细节,提升开发效率。

这也是 AOP 面向切面编程的一种应用。

安装依赖

npm install koa koa-body koa-logger koa-router --save

修改 src/app.js 项目入口文件

import Koa2 from 'koa'
import koaLogger from 'koa-logger'
import koaBody from 'koa-body'
import router from './router'const env = process.env.NODE_ENV || 'development'const app = new Koa2()// Console
app.use(koaLogger())
// Body Format
app.use(koaBody())
// Routes
app.use(router.routes())
app.use(router.allowedMethods())if (env === 'development') {app.use(async (ctx, next) => {const start = new Date()await next()const ms = new Date() - startconsole.log(`${ctx.method} ${ctx.url} - ${ms}ms`)})
}app.listen(9000)console.log('Now start API server on port 9000 ...')

创建 src/router.js 路由文件

import KoaRouter from 'koa-router'const router = new KoaRouter()router.get('/', (ctx, next) => {ctx.body = 'hello focus'
})router.get('/error', (ctx, next) => {throw new Error('Ops...')
})export default router

启动项目

npm run dev

现在我们就可以在浏览器访问 http://localhost:9000/

但是,如果我们访问 http://localhost:9000/error 会发现显示的是服务错误信息,并且返回的状态码为500

作为一个API服务器,我们希望即使程序出错了,返回的状态码依然是200,错误信息放在响应数据里,且依然为JSON格式。

异常处理中间件

src/app.js 入口中添加一个中间件

// code ...
const app = new Koa2()// 异常处理
app.use(async (ctx, next) => {try {await next()} catch (error) {ctx.body = { status: ctx.status, message: error.message }ctx.status = 200}
})
// Console
app.use(koaLogger())
// code ...

此时再访问 http://localhost:9000/error 会发现状态码已变成200,且错误信息放在JSON格式的响应数据中。

小结

至此,我们已经了解了Koa2框架以及中间件的基本工作原理。

下一章将会给大家讲解项目的目录结构,以及 MVC 模式的变形及应用。

这篇关于从零开始搭建实战级Nodejs服务项目 —— 2. 洋葱模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445286

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言