从零开始搭建实战级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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}