node后端服务框架

前言:

随着互联网的快速发展,Web 开发已成为当今计算机领域中非常重要的一部分。

Node.js 的出现为前端开发者提供了一个全新的方向,使得他们可以同时涉足前端和后端开发。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,它使 JavaScript 有了在服务器端运行的能力,使得前端开发者可以使用已经熟悉的 JavaScript 语言来开发后端应用程序。

使用node开发后端服务框架有:express、koa、nestjs、fastify等等。

nodejs做服务端的优点

大厂企业级Nodejs的应用实践

在这里插入图片描述

一、express

官网网址:https://www.expressjs.com.cn/

express adj 快速的

安装:
npm install express --save
优点:
  1. 使用简单,上手容易。
  2. 社区活跃,文档齐全。
  3. 提供了很多预定义的中间件和路由,使得开发者可以快速地搭建出一个 Web 应用程序。
  4. 已经经过了很长时间的实践,稳定性和可靠性较高。
缺点:

基于ES5的语法,要实现异步代码,只有一个方法:回调。如果异步嵌套层次过多,代码写起来就非常难看

实现异步
app.get('/', (req, res) => {
  new Promise((resolve, reject) => {
    resolve(A())
  })
    .then((r) => {
      return B(r)
    })
    .then((r) => {
      res.send({
        name: r,
        age: 18
      })
    })
})

function A() {
  return 'A'
}

function B(name) {
  return name + 'B'
}

错误处理
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
解析参数
// get
app.get('/', (req, res) => {
  console.log('req', req.query)
})

// post
// 前提:解析post数据需要用到body-parser
app.post('/test', (req, res) => {
  console.log(req.body)
  res.send(req.body)
})
连接数据库

https://blog.csdn.net/qq_43852612/article/details/131390670

二、koa

官方网址:https://koa.bootcss.com/

安装:

Koa 依赖 node v10.16.0 或 ES2015及更高版本和 async 方法支持。

npm install koa
npm install koa-router  // 路由
npm i -S koa-combine-routers  // 合并路由
优点:
  1. 简洁、只需通过添加中间件对数据处理
  2. async/await
  3. 丰富的中间件
缺点:
  1. 相对于 Express,Koa 的学习曲线较陡峭,需要开发者具备一定的 JavaScript 基础和异步编程经验。
  2. 由于 Koa 是一个相对较新的框架,因此社区和文档相对较少,可能会给开发者带来一些不便。
错误处理
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.statusCode || err.status || 500;
    ctx.body = {
      message: err.message
    };
  }
});
连接数据库

https://blog.csdn.net/weixin_41897680/article/details/130916005

实现异步
router.get('/', async (ctx, next) => {
  const a = await A()
  const b = await B()
  ctx.response.body = a + b
})

function A() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('A')
    }, 2000)
  })
}

function B() {
  return 'B'
}

三、nest

介绍:

Nest(NestJS)是一个用于构建高效、可扩展 Node.js 服务器端应用程序的框架。它使用渐进式的JavaScript,完全支持并构建于 TypeScript 上(同时仍然允许开发者使用纯JavaScript进行编码),结合了面向对象编程(OOP)、函数式编程(FP)和函数响应式编程(FRP)的元素。
在内部,Nest使用强大的HTTP服务器框架,如 Express(默认)并且可以选择配置为使用 Fastify!
Nest在这些常见的Node.js框架(Express/Fastify)之上提供了一层抽象,同时也直接向开发者暴露了它们的API。这使得开发者可以自由使用众多为底层平台提供的第三方模块。

原理

尽管存在大量出色的库、助手和工具供Node(以及服务器端JavaScript)使用,但没有一个能有效地解决主要问题——架构
Nest提供了一个开箱即用的应用程序架构,允许开发者和团队创建高度可测试、可扩展、松耦合且易于维护的应用程序。

官方网址:https://nestjs.com/ (英文
nestjs中文网:https://nest.nodejs.cn/
第三方nestjs文档:http://nestjs.inode.club/

安装:
npm i -g @nestjs/cli  // 安装nest cli
nest new project-name   // 初始化项目
目录介绍
文件解释
app.controller.ts一个具有单一路由的基本控制器.
app.controller.spec.ts控制器的单元测试.
app.module.ts应用程序的根模块.
app.service.ts一个基本的服务,拥有一个单一的方法.
main.ts应用程序的入口文件将使用核心函数 NestFactory 来创建一个 Nest 应用程序实例.
优点
  1. TypeScript 支持:NestJS 的一个主要优势是它对 TypeScript 的一流支持。TypeScript 提供了强类型、接口和装饰器,这些特性有助于提高代码质量和可维护性。

  2. 模块化结构:NestJS 鼓励使用模块化架构,这有助于组织和分离关注点,使代码更易于管理和扩展。

  3. 依赖注入(DI):NestJS 实现了 Angular 风格的依赖注入系统,这使得代码更加干净、可测试,并易于重构。

  4. 内置应用程序架构:NestJS 提供了一个内置的应用程序架构,包括控制器、服务、中间件等,这有助于快速开发和维护大型应用程序。

  5. 微服务支持:NestJS 提供了一套简单的微服务选项,支持多种传输层策略,如 TCP、MQTT、RabbitMQ 等。

  6. 丰富的生态系统:NestJS 拥有一个活跃的社区和丰富的生态系统,提供了许多现成的模块和工具,以简化开发过程。

  7. 与其他库的良好集成:NestJS 可以很容易地与其他 JavaScript 库和模块集成,如 TypeORM、Mongoose 等。

缺点
  1. 学习曲线:对于不熟悉 TypeScript 或 Angular 的开发人员来说,NestJS 的学习曲线可能会比较陡峭。

  2. 性能开销:由于其抽象层和额外的功能,NestJS 可能会比一些更轻量级的 Node.js 框架有更多的性能开销。

  3. 相对较新:虽然 NestJS 社区正在迅速增长,但它相对于其他一些长期存在的 Node.js 框架(如 Express.js)来说还是较新的。这可能意味着某些情况下资源和支持有限。

  4. 过度工程化风险:NestJS 的严格架构和模式可能会导致过度工程化,特别是在小型项目或简单应用中。

  5. 可能的过度依赖框架:NestJS 的强大功能可能导致开发者过度依赖框架本身,从而限制了某些自定义和灵活性。

nestjs设计模式

nest 常用命令
nest --help

在这里插入图片描述
例子:创建user模块

nest g res user  
装饰器

装饰器是一种特殊的类型声明,他可以附加在类,方法,属性,参数上面

装饰器
@Request()req
@Response()res
@Next()next
@Session()req.session
@Param(key?: string)req.params/req.params[key]
@Body(key?: string)req.body/req.body[key]
@Query(key?: string)req.query/req.query[key]
@Headers(name?: string)req.headers/req.headers[name]
@HttpCode
接口传参
get接口接参

@Request

  @Get('/findall')
  findAll(@Request() req: any) {
    console.log(req.query);   // get是query
    return this.userService.findAll();
  }

@Query

  @Get('/findall')
  findAll(@Query() req: any) {
    console.log(req);   // 直接读取传来的参数
    return this.userService.findAll();
  }
post接口接参

@Request

  @Get('/findall')
  findAll(@Request() req: any) {
    console.log(req.body);   // post是body
    return this.userService.findAll();
  }

在这里插入图片描述

  @Post('/createuser')
  create(@Body('age') req: any) {
    console.log(req);
    return this.userService.create();
  }
动态参数
  @Get('/findall/:id')
  findAll(@Request() req: any) {
    console.log(req.params.id);
    return this.userService.findAll();
  }

语法糖:

  @Get('/findall/:id')
  findAll(@Params() params: any) {
    console.log(params.id);
    return this.userService.findAll();
  }

除此之外 我们还可以使用@Headers读取请求头的信息,使用@HttpCode控制返回的状态码

  // header测试
  @Get('/headertest')
  @HttpCode(500)
  headertest(@Headers() headers: any) {
    console.log('headers', headers);
    this.userService.findAll();
  }
连接数据库
1. ORM框架(typeOrm)

官网:https://typeorm.bootcss.com/
typeOrm 是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的,所以可以很好地与 Nest 框架集成,有了它就可以在nest中不使用sql操作数据库。

除了使用typeOrm还可以使用Prisma
官网:https://prisma.yoga/

安装依赖

npm install --save @nestjs/typeorm typeorm mysql2
import { TypeOrmModule } from '@nestjs/typeorm';

    TypeOrmModule.forRoot({
      type: "mysql", //数据库类型
      username: "root", //账号
      password: "123456", //密码
      host: "localhost", //host
      port: 3306, //
      database: "portal", //库名
      entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
      synchronize:true, //synchronize字段代表是否自动将实体类同步到数据库
      retryDelay:500, //重试连接数据库间隔
      retryAttempts:10,//重试连接数据库的次数
      autoLoadEntities:true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
    }),

实体

实体是一个映射到数据库表的类。 你可以通过定义一个新类来创建一个实体,并用@Entity()来标记:

import {Entity,Column,PrimaryGeneratedColumn} from 'typeorm'
 
@Entity()
export class Test {
    @PrimaryGeneratedColumn()
    id:number
    
    @Column()
    name:string
 
    @Column()
    password:string
 
    @Column()
    age:number
}
主列

自动递增的主键

	@PrimaryGeneratedColumn()
	id:number

	@PrimaryGeneratedColumn("uuid")  // 自动递增的uuid
	id:number
列类型
    @Column({type:"varchar",length:200})
    password: string
 
    @Column({ type: "int"})
    age: number
 
    @CreateDateColumn({type:"timestamp"})
    create_time:Date
列选项
    @Column({
        type:"varchar",
        name:"ipaaa", //数据库表中的列名
        nullable:true, //在数据库中使列NULL或NOT NULL。 默认情况下,列是nullable:false
        comment:"注释",
        select:true,  //定义在进行查询时是否默认隐藏此列。 设置为false时,列数据不会显示标准查询。 默认情况下,列是select:true
        default:"xxxx", //加数据库级列的DEFAULT值
        primary:false, //将列标记为主要列。 使用方式和@ PrimaryColumn相同。
        update:true, //指示"save"操作是否更新列值。如果为false,则只能在第一次插入对象时编写该值。 默认值为"true"
        collation:"", //定义列排序规则。
    })
    ip:string

@InjectRepository(User) private readonly user: Repository?

在 NestJS 中,@InjectRepository(User) 是一个装饰器,用于依赖注入。这个特定的装饰器是 TypeORM 与 NestJS 集成的一部分,用于注入特定实体的仓库(在这个例子中是 User 实体)。它允许你在类中使用仓库模式,从而可以进行数据持久化操作,例如查询、插入、更新和删除。

数据的增删改查

// 创建响应拦截器

// 创建错误拦截器

请求拦截器

插件推荐

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

批量导出域控用户及其所在OU和组

在Windows域环境中,批量导出域控用户及其所在OU(组织单位)和组成员身份信息,可以使用PowerShell脚本实现。以下是一个基本的示例脚本: Import-Module ActiveDirectory# 遍历所有用户 Get-ADUser -Filter * -Propertie…

数组奇缘:林浩然与杨凌芸的Java编程冒险记

数组奇缘:林浩然与杨凌芸的Java编程冒险记 Array Odyssey: The Java Programming Adventure of Lin Haoran and Yang Lingyun 在Java编程的广阔天地中,林浩然和杨凌芸的故事如同一段奇妙而生动的冒险传奇。林浩然,一个对代码充满热情、逻辑严…

python16-Python的字符串之转义字符

.前面已经提到,在字符串中可以使用反斜线进行转义;如果字符串本身包含反斜线,则需要使用“”表示,“W”就是转义字符。Python当然不会只支持这么几个转义字符,Python支持的转义字符如下表 掌握了上面的转义字符之后,下…

互斥锁/读写锁的概念及使用、死锁的避免

互斥锁的概念和使用 线程通信-互斥 临界资源:一次只允许一个任务(进程、线程)访问的共享资源 临界区:访问临界资源的代码 互斥机制:mutex互斥锁,任务访问临界资源前申请锁,访问完后释放锁互斥锁初始化 两种方法创建互…

中科星图——MODIS/006/MYD13A1的MYD13A1.006类数据集

数据名称: MYD13A1.006 Modis 16天 Aqua 500m 数据来源: NASA 时空范围: 2000-2022年 空间范围: 全国 数据简介: MOD13A1 V6数据集是由Aqua星搭载的中分辨率成像光谱仪获取的L3级植被指数产品&#xff0c…

三角函数转换(积分必备)

目录 一、诱导公式 二、二角和差公式 三、积化和差公式 四、万能、辅助角公式 五、倍角公式 六、反三角函数 七、余弦定理 一、诱导公式 1.公式一:设α为任意角,πα的三角函数值与α的三角函数值之间的关系 sin(π A) =-s…

《向量数据库指南》——Milvus Cloud向量过滤搜索及其优化

向量过滤搜索是一种基于条件的向量搜索方法,常用于推荐系统和信息检索等领域,能够帮助用户快速找到在给定条件下与其查询相关的内容。 在 Milvus Cloud社区中,这也是呼声比较高的功能。为满足广大用户的需求,Milvus Cloud在 Knowh…

王殿华主任:中医对睡眠的认知与睡眠障碍分类

睡眠不足不仅会导致黑眼圈,还会带来许多健康风险。怎样才能睡得更好? 一、睡眠障碍的分类 失眠症呼吸系统相关睡眠障碍;中枢多发性睡眠;睡眠节律紊乱;睡眠异常;睡眠运动障碍;其他睡眠障碍。 失…

CSS3的学习笔记

CSS3的学习笔记 什么是css: CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用来描述网页样式和布局的标记语言。它可以控制网页中的文字大小、颜色、间距、背景、边框、布局等方面,使网页更加美观和易于阅读。通过CSS&a…

Jmeter学习系列之一:Jmeter的详细介绍

目录 一、Jmeter的介绍 二、Jemeter的特点 三、Jemter相关概念 3.1采样器(Samplers) 3.2逻辑控制器(Logic Controllers) 3.3监听器(Listeners) 3.4配置元件(Configuration Elements&#…

python 匿名函数lambda的简洁用法

当前版本: Python 3.8.4 文章目录如下 1. lambda 的特点 2. lambda 的用法 2.1. 基本语法 2.2. 函数传参 2.3. 结合条件语句 3. lambda 的应用场景 3.1. 处理列表 3.2. 处理字典 1. lambda 的特点 lambda 是一种匿名函数的定义方式,也称为 lam…

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具,Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/,点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…

MySQL十部曲之六:数据操作语句(DML)

文章目录 前言语法约定DELETEINSERTSELECT查询列表SELECT 选项子句FROMWHEREORDER BYGROUP BYHAVINGWINDOWLIMITFOR SELECT ... INTO连接查询CROSS JOIN和INNER JOINON和USINGOUTER JOINNATURE JOIN 子查询标量子查询使用子查询进行比较带有ANY、IN或SOME的子查询带有ALL的子查…

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升,越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL(Secure Sockets Layer)或TLS(Transport Layer Security)证书,以实现数据加密传输&#x…

docker 容器管理

文章目录 docker 容器管理容器基础容器概念可写的容器层容器的磁盘大小写时拷贝 容器操作容器创建和运行容器的启停查看容器信息进入容器操作删除容器基于容器创建镜像 容器限制限制容器内存限制容器CPU限制容器块IO带宽资源限制的实现机制动态修改容器配置 容器监控容器监控命…

热门应用滥用苹果 iPhone 推送通知,暗中窃取用户数据

移动研究人员 Tommy Mysk 近日揭露,部分热门应用利用 iPhone 推送通知功能秘密发送用户数据,这引发了用户隐私安全担忧。 许多 iOS 应用程序正在使用由推送通知触发的后台进程来收集设备的用户数据,从而有可能创建用于跟踪的指纹档案。 Mys…

【misc | CTF】攻防世界 2017_Dating_in_Singapore

天命:这次终于碰到了算是真正的misc题目了 下载附件,打开是PDF,我一开始以为是flag隐写在PDF里面了 虽然也不奇怪,应该是可以的,毕竟PDF有xss漏洞也是可以的 言归正传,打开PDF 看着新加坡的日历&#xff…

机器学习系列15:通过t-SNE可视化高维数据

t-SNE 的全称是 t-distributed stochastic neighbor embedding(t-分布随机领域嵌入),这是一种非线性降维技术。而 PCA 和 LDA 是线性的降维技术。 t-SNE 通常用来在二维或者三维空间中可视化复杂数据集。 简单来说,t-SNE 试图发…

idea中Spring项目yml文件注释中文乱码问题

idea中spring项目yml文件中文乱码问题,如图: 当出现这种情况一般就是idae的配置问题,解决起来也是非常简单的。 按下面操作即可,如图: 解决方式: 1.进入设置 2.找到File Encodings,然后再将编…

PWN 常用工具-补充

目录 pwndbg 如何加载文件 如何运行到Main函数停止 如何查看程序的内存布局 查看内存地址存储的值 如何查看某个地址存储的指令 搜索字符串 打印 调试相关 断点相关 查看栈内数据 查看栈调用顺序 从程序回到gdb 修改内存中的值 file 可执行文件特征 动态链接文…
最新文章