【Node.js后端架构:MVC模式】基于expres讲解

Node.js后端架构:MVC模式

什么是MVC

MVC (Model-View-Controller) 是一种软件设计模式,用于将应用程序的逻辑分离成三个不同的组件:模型、视图和控制器。

  • 模型(Model)负责处理应用程序的数据逻辑。它负责从数据库或其他数据源中获取数据,并对数据进行处理和操作。

  • 视图(View)负责展示数据给用户。它负责将模型中的数据以用户友好的方式呈现出来,通常是通过HTML模板或其他前端技术来实现。

  • 控制器(Controller)负责处理用户的请求和操作。它接收用户的输入,并根据输入调用适当的模型和视图来完成相应的操作。

MVC的优点在于它能够将应用程序的不同部分分离开来,使得代码更易于维护和扩展。通过将数据逻辑、展示逻辑和用户交互逻辑分离开来,开发人员可以更好地组织和管理代码。

在这里插入图片描述

Node.js中的MVC

在Node.js的后端开发中,使用MVC模式可以帮助我们更好地组织和管理代码。我们可以将数据逻辑放在模型中,将展示逻辑放在视图中,将用户交互逻辑放在控制器中。这样,我们可以更好地分离关注点,使得代码更易于理解和维护。

  • 1,Client 端发送请求到 Server 端。
  • 2,server 端的Controller接收请求并进行解析。
  • 3,Controller找到与请求对应的Model,并将请求交给该 Model 处理。
  • 4,Model 处理完后,将数据返回给Controller,并由Controller交给 View处理。
  • 5,View生成可供客户端查看的HTML文件,并将结果返回给服务器端。
  • 6,Server 端发送响应到 Client 端。

注意:如果只是开发API,第5步骤将会变成将数据返回给控制器,并由控制器将数据转换为API响应格式,然后将响应发送回客户端。视图的生成步骤可以省略,因为API不需要生成HTML文件。

快速创建Express中的 MVC

在Express中,使用快速建立开发环境的方式生成Express项目时,MVC的工作方式如下:

在这里插入图片描述

  • 1,Client端发送请求至 Server端。
  • 2,Server端将收到的请求由特定的Router(相当于 Controller )来做处理。
  • 3,若收到的请求需要DB来交互数据,则从DB中交互数据,并回传至Router中。若不需要数据库则直接返回。
  • 4,待Router处理完业务的逻辑后,将其结果传给View,并由View来产生html文件。
  • 5,通过Router来将View所产生的html文件送至Server端中。
  • 6,Server端回复响应至Client端。

注意:如果只是开发API,第5步骤将会变成: 数据通过 Router直接给 Server端,视图的生成步骤可以省略,因为API不需要生成HTML文件。

读者可以发现,借由Express的快速建置开发环境的项目中,Router本身就会涵盖了controller及model的部分。

快速建立开发环境的方式的目录结构是:

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views├── error.ejs└── index.ejs

也就是说我们将controller及model的部分都集中写在 routes 文件夹下。假设以 routes 文件夹中的index.js来说,其代码会是:

var express = require('express');
var router = express.Router();/* GET home page. */
router.get('/', function(req, res, next) {// do something// 連接資料庫// 從資料庫將資料撈完後進行res.render的動作。
});module.exports = router;

注释:res.render 指Express中,让处理完的数据传送到view的指令。

自定义 Express 中的MVC

若使用Express的快速建置开发环境的项目,是还没有做到职责分离的动作,我们可以试着将controller及model加入其中,其运作会是:

在这里插入图片描述

  • 1,Client端 发送request至 Server端
  • 2,Server端接收到request后,交由特定的 Router 的function所接收,并调用相对应的 Controller
  • 3,通过相对应的 Controller 的 function 来调用特定的model进行处理。
  • 4,若该request需要与DB来进行数据交互,则从DB中数据交互,并将数据回传至Model中。若无则直接在Controller处理业务逻辑。
  • 5,待Model处理完数据的逻辑后,将其结果回传至 Controller 中进行业务逻辑的处理 。
  • 6,ControllerModel的数据传给View,并由View来生成html文件。
  • 7,通过 Controller 来将view所生成的html文件送至server端中。
  • 8,Server端回复response至 Client端

注意:
如果只需要开发API,可以跳过第6步骤,并且第7步骤会变成:
通过ControllerModel处理完的结果交由server端。

那现在的目录结构如下:

.
├── app.js
├── bin
│   └── www
├── controllers
│   ├── index_controller.js
├── models
│   ├── index_model.js
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views├── error.ejs└── index.ejs

通过添加controllers和models文件夹,并让其中的JavaScript文件分别负责处理controller和model的部分,实现了职责分离。在controllers文件夹中的文件负责处理请求的业务逻辑,而在models文件夹中的文件负责与数据库进行交互和处理数据。这样可以使代码更加模块化和可维护,提高开发效率和代码的可读性。

可以编写以下代码来处理请求的路由逻辑:

  • 在routers文件夹中的index.js文件中,
const IndexController = require('../controllers/index_controller');indexController = new IndexController();router.get('/', indexController.sayHiController);
  • controllers文件夹的 index_controller.js
const IndexModel = require('../models/index_model');indexModel = new IndexModel();module.exports = class IndexController {sayHiController(req, res ,next) {// do something// 调用model中的函数,从数据库中获取数据// 使用res.json将数据作为响应发送给客户端 。}
}
  • models 文件夹的 index_model.js
module.exports = class IndexModel {sayHiModel(req, res ,next) {// 从数据库中查询数据//插入新的数据到数据库//更新数据库中的数据//删除数据库中的数据//对数据进行验证和格式化//执行复杂的数据操作,如聚合、联表查询等//处理与数据相关的业务逻辑}
}

小结

MVC确实是一种理念和设计模式,而不是一种具体的技术。它的目的是将应用程序的不同部分分离开来,使代码更加模块化、可维护和可扩展。

在实际开发中,如何分离整个程序的职责是根据具体情况而定的。每个项目都有不同的需求和约束,因此选择适合项目的架构和设计模式非常重要。与后端开发团队进行沟通和协商,共同决定如何进行开发是至关重要的。

除了MVC,还有其他的架构和设计模式可以用于开发,如MVVM、MVP、Clean Architecture等。选择合适的架构和设计模式取决于项目的规模、复杂性和团队的技术栈和经验。

总之,开发团队应该根据项目需求和团队的实际情况,选择适合的架构和设计模式,并进行良好的沟通和协作,以确保项目的成功和代码的质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS事件循环详解

前言 进程 程序运行需要其专属的内存空间,可以把这块内存空间简单理解为进程。 下图每个颜色块都可视为一个应用,每个应用至少应有一个进程,进程之间相互独立,即使想要通信,也需要双方同意。 线程 有了进程后&…

二次元检测设备导轨修复指南

二次元检测设备是一种高精度的测量仪器,用于检测物体表面的形状、尺寸和精度等。直线导轨是二次元检测设备中最重要的组成部分之一,它的精度和稳定性直接影响到设备的测量结果和可靠性,因此,对导轨进行修复和保养是非常重要的。 直…

Linux删除了大文件为什么磁盘空间没有释放?

某天,收到监控系统的告警信息,说磁盘空间占用过高,登上服务器,使用 df -h 一看,发现磁盘占用率已经 96%了: 通过查看 /usr/local/nginx/conf/vhost/xxx.conf 找到 access_log 和 error_log 的路径&#x…

SDX12 上层应用gdb调试及环境搭建

SDX12 上层应用gdb调试及环境搭建 1. 问题背景2 环境搭建3 操作步骤4. 调试过程5 实现效果6 附录 1. 问题背景 上层应用在问题定位的过程中,现有手段只能有有限的log打印,通常情况下很难定位问题。如果想在应用程序执行的过程中查看任意调用关系或者数据…

6.1810: Operating System Engineering <Lab2 syscall: System calls>

课程链接:6.1810 / Fall 2023 一、本节任务 二、要点 操作系统要满足三要素:并发、隔离、交互(multiplexing, isolation, and interaction)。 宏内核(monolithic kernel):是操作系统核心架构…

temu上新待确认在哪里点

在Temu平台上,作为卖家,您可能需要上架新的商品以吸引更多的买家。下面是一般的步骤,但请注意,不同平台的操作可能略有不同,具体请参考Temu官方的帮助文档或联系客服。 先给大家推荐一款拼多多/temu运营工具——多多情…

pathlib --- 面向对象的文件系统路径

目录 基础使用 纯路径 通用性质 运算符 访问个别部分 方法和特征属性 具体路径 方法 对应的 os 模块的工具 3.4 新版功能. 源代码 Lib/pathlib.py 该模块提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 …

k8s部署jenkins

1.先决条件 1.因为国内的容器镜像加速器无法实时更新docker hub上的镜像资源.所以可以自己进行jenkins的容器镜像创建,. 2.这里用到了storageClass k8s的动态制备.详情参考: k8s-StoargClass的使用-基于nfs-CSDN博客 3.安装docker服务.(用于构建docker image) 2.构建jenki…

Mac右键添加通过VSCode打开

Mac右键添加通过VSCode打开 1 首先打开自动操作 进入方式 访达 – 应用程序 – 自动操作 2. 选择快速操作 3. 添加 最后 commands保存,可以输入自定义的名称 for f in "$" doopen -a "Visual Studio Code" "$f" done4. 找到保存的快…

KaiwuDB 多模数据库-时序性能优化

随着物联网领域的快速发展,时序数据的产生和处理需求不断增长。为了满足实时性、高效性和准确性的要求,数据库需要进行时序性能优化,以提供快速的数据写入、实时查询和高效的数据存储与处理能力。 本期直播介绍了时序数据和时序数据库特征以…

树莓派3B+ PCB叠层设计

板子废了&#xff0c;用电磨切了下&#xff0c;看看是什么叠层。 由于有BCM43455 WIFI芯片&#xff0c;这个是0.3ball 0.4pitch&#xff0c;肯定是要用盲孔布线的。 然后根据这个切面看&#xff0c;板子是6层的&#xff0c;外层内层铜厚应该是一样的 1-2层介质特别薄竟然<1o…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

小米智能摄像头mp4多碎片手工恢复案例

小米智能摄像头mp4多碎片手工恢复案例 智能摄像头目前在市场上极为常见&#xff0c;仅需要一张存储卡即可实现视频、音频的采集&#xff0c;同时可以通过手机APP进行远程控制&#xff0c;相比传统安防品牌成本更低、更容易部署。在智能摄像头品牌中小米算是绝对的大厂&#xf…

折扣因子的变化图(Python)

var 3 var_list [3] for _ in range(50):var * .95var_list.append(var)import matplotlib.pyplot as plt import numpy as np plt.plot(np.arange(len(var_list)), var_list, linewidth1) plt.show()

Mysql的分库分表

一、单Mysql节点 假如一主一从 为什么不能无限读&#xff1f; 瓶颈分析&#xff1a; 资源限制&#xff1a; 如CPU、内存、磁盘I/O、网络带宽等。随着读请求的增加&#xff0c;服务器的负载将会增加&#xff0c;甚至可能导致系统崩溃。 连接数限制&#xff1a; MySQL有最大连…

uniapp 使用web-view外接三方

来源 前阵子有个需求是需要在原有的项目上加入一个电子签名的功能&#xff0c;为了兼容性和复用性后面解决方法是将这个电子签名写在一个新的项目中&#xff0c;然后原有的项目使用web-view接入这个电子签名项目&#xff1b; 最近又有一个需求&#xff0c;是需要接入第三方的…

【前端】浅谈async/await异步传染性

文章目录 概述观点无法解决可以解决 来源 概述 "异步传染性"问题通常是指&#xff0c;当一个函数使用了async和await&#xff0c;其调用者也需要使用async和await处理异步操作&#xff0c;导致整个调用链都变成异步的。这种情况可能导致代码变得更复杂&#xff0c;不…

WSL2 docker GUI 界面

在 WSL2 docker 中运行GUI界面。 具体流程和远程显示Ubuntu界面类似&#xff0c;链接, 更简单一点&#xff0c; 少了 ssh 的部分。 安装好wsl2 和 docker wsl2 运行GUI程序&#xff0c;windows 会默认弹出窗口。 可以安装 gedit 测试一下 windows 下载并运行 Xlaunch. 运行 d…

轻松配置PPPoE连接:路由器设置和步骤详解

在家庭网络环境中&#xff0c;我们经常使用PPPoE&#xff08;点对点协议过夜&#xff09;连接来接入宽带互联网。然而&#xff0c;对于一些没有网络专业知识的人来说&#xff0c;配置PPPoE连接可能会有些困难。在本文中&#xff0c;我将详细介绍如何轻松配置PPPoE连接&#xff…

FO-like Transformation in QROM Oracle Cloning

参考文献&#xff1a; [RS91] Rackoff C, Simon D R. Non-interactive zero-knowledge proof of knowledge and chosen ciphertext attack[C]//Annual international cryptology conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 1991: 433-444.[BR93] Bellare M…