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是queryreturn 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是bodyreturn 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", //hostport: 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")  // 自动递增的uuidid: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:falsecomment:"注释",select:true,  //定义在进行查询时是否默认隐藏此列。 设置为false时,列数据不会显示标准查询。 默认情况下,列是select:truedefault:"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.hqwc.cn/news/437912.html

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

相关文章

sqli.labs靶场(第18~22关)

18、第十八关 经过测试发现User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0加引号报错 这里我们闭合一下试试 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0,127.0.0.1,adm…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。 例如:有…

SQL注入的剩余类型

除了联合查询注入,报错注入,盲注注入 sql注入还有以下几类🦹🦹🦹🦹🦹 开始填坑 1.UA注入 原理:有些网站会把用户的UA信息写入数据库,用来收集和统计用户…

elementui的el-table自定义控制展开事件,实现“展开”“收起”的切换(两种效果)【超级完整式代码】

第一种&#xff1a;多行点击展开其他行不收起 先看效果图 直接上代码 【核心代码添加标注简单易懂】 <el-tableref"multipleTable":data"smsLogList.slice((currentPage - 1) * pageSize_, currentPage * pageSize_)"tooltip-effect"dark"st…

Python拼接字符串

在Python编程中&#xff0c;字符串拼接是一项常见的操作&#xff0c;它可以用于将多个字符串连接起来形成一个新的字符串&#xff0c;是处理文本数据和字符串操作的基本技巧之一。 1. 使用""运算符进行字符串拼接 最常见的字符串拼接方法是使用""运算符&…

专业130+总分390+第二名中国海洋大学946信号与系统考研经验电子信息通信

今年专业946信号与系统130&#xff0c;总分390&#xff0c;专业排名第2顺利上岸中国海洋大学&#xff0c;总结一下自己的复习经验希望对大家复习有所帮助&#xff0c;每个人的学习习惯不同&#xff0c;大家要对自己有信心&#xff0c;借鉴加上自己整合&#xff0c;属于自己的才…

在Windows上安装与配置Apache服务并结合内网穿透工具实现公网远程访问本地内网服务

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

Git 教程 | 将本地修改后的文件推送到 Github 指定远程分支上

Git 是一种分布式版本控制系统&#xff0c;用于敏捷高效地处理任何大小的项目。它是由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开源版本控制软件。Git 的本地克隆就是一个完整的版本控制存储库&#xff0c;无论脱机还是远程都能轻松工作。开发人员会在本地提交其工…

【JavaScript 基础入门】01 编程语言和计算机基础

编程语言和计算机基础 目录 编程语言和计算机基础1 - 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别1.6 总结 2 - 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1 - 编程语言 1.1 编程 编程&#xff1a; 就是让计算…

Qt线程高级应用

一般我们在用Qt开发时&#xff0c;把耗时操作放在线程中执行&#xff0c;避免卡界面&#xff0c;Qt的线程使用有两种方式&#xff0c;一种是继承QThread&#xff0c;一种是moveToThread的方式&#xff0c;以及QtConcurrent方式 首先我们来看第一种&#xff1a; #ifndef WORKER…

上推加载更多组件

本组件使用的是TaroReact 实现的 &#xff0c;具体代码如下 一共分为tsx和less文件 //index.tsx /** RefreshLoading* description 上推加载更多组件* param loading boolean* param style* returns*/import { View } from "tarojs/components"; import React, { FC…

DELL R740 两个raid10安装centos7.9

DELL R740 两个raid10安装centos7.9 服务器硬件配置&#xff1a; DELL R740&#xff1a;R740/4214R (12C,100W,2.4GHz)*2/128G(32G DDR4 RDIMM)*4 /600G SAS 10K *41.2T SAS 转速10K*4/H750 &#xff08;8G 缓存&#xff09;/750W *2/iDRAC9 要求&#xff1a;600G*4&#xf…