NestJS学习:搭建项目、依赖注入、常用命令、RESTful 风格设计

news2025/1/14 2:21:34

介绍

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。

在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !

Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。

Nest.js:是“Angular 的服务端实现”,基于装饰器。会有很多angular的开发风格。

中文网址:https://docs.nestjs.cn/

参考:B站视频教程

作者也是csdn的大佬,博客地址是:小满zs

项目搭建

创建项目

//安装脚手架
npm i -g @nestjs/cli
/创建项目
nest new project-name

将会创建 project-name 目录, 安装 node_modules 和一些其他样板文件,并将创建一个 src 目录,目录中包含几个核心文件。

src
 ├── app.controller.spec.ts
 ├── app.controller.ts
 ├── app.module.ts
 ├── app.service.ts
 └── main.ts

app.controller.ts 带有单个路由的基本控制器示例,用于编写路由
app.controller.spec.ts 对于基本控制器的单元测试样例
app.module.ts 应用程序的根模块。
app.service.ts 带有单个方法的基本服务,主要编写接口返回什么数据。
main.ts 应用程序入口文件。它使用 NestFactory 用来创建 Nest 应用实例。类似于vue的main.ts

main.ts 包含一个异步函数,它负责引导我们的应用程序:

/* main.ts */
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

要创建一个 Nest 应用实例,我们使用了 NestFactory 核心类。NestFactory 暴露了一些静态方法用于创建应用实例。 create() 方法返回一个实现 INestApplication 接口的对象。该对象提供了一组可用的方法

请注意,使用 Nest CLI 搭建的项目会创建一个初始项目结构,我们鼓励开发人员将每个模块保存在自己的专用目录中。

启动

$ npm run start

此命令启动 HTTP 服务监听定义在 src/main.ts 文件中定义的端口号。在应用程序运行后, 打开浏览器并访问 http://localhost:3000/。 你应该看到 Hello world! 信息。
在这里插入图片描述
遇到的问题
发现eslint老是报下面的这个错误
在这里插入图片描述
查了一下是由于行尾风格配置导致,解决方法,在.prettierrc 文件中添加如下代码

 "endOfLine": "auto"

按快捷键:ctrl + shift + p,选择重启eslint

在这里插入图片描述

依赖注入

未使用控制反转和依赖注入之前的代码

class A {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

class B {
  age: number;
  entity: A;
  constructor(age: number) {
    this.age = age;
    this.entity = new A('张三');
  }
}

const c = new B(15);

c.entity.name;

B 中代码的实现是需要依赖 A 的,两者的代码耦合度非常高。当两者之间的业务逻辑复杂程度增加的情况下,维护成本与代码可读性都会随着增加,并且很难再多引入额外的模块进行功能拓展。

为了解决这个问题可以使用IOC容器

class A {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

//中间件用于解耦
class Container {
  modeuls: any;
  constructor() {
    this.modeuls = {};
  }
  provide(key: string, modeuls: any) {
    this.modeuls[key] = modeuls;
  }
  get(key) {
    return this.modeuls[key];
  }
}

class B {
  a: any;

  constructor(container: Container) {
    this.a = container.get('a');
  }
}

const mo = new Container();
mo.provide('a', new A('张三'));
const c = new B(mo);

c.a;

本质上就是写了一个中间件,来收集依赖,主要是为了解耦,减少维护成本

常用命令

nest --help 可以查看nestjs所有的命令
在这里插入图片描述
Nest.js:是“Angular 的服务端实现”,基于装饰器。两种直接命令也是很相似的。

生成controller.ts

nest g co 名称

会自动生成文件,并将文件添加到app.module.ts
在这里插入图片描述

生成 module.ts

nest g mo 模块名

创建的模块会自动添加到app.module.ts里的imports数组里
在这里插入图片描述

生成service.ts

nest g s 服务名

生成CURD模板

 nest g resource 名称

第一次使用这个命令的时候,除了生成文件之外还会自动使用 npm 帮我们更新资源,安装一些额外的插件,后续再次使用就不会更新了。
大多少情况选择第一个即可
在这里插入图片描述
会自动生成文件和基础代码,方便快速开发
在这里插入图片描述
在这里插入图片描述

RESTful 风格设计

RESTful 是一种风格,在RESTful中,一切都被认为是资源,每个资源有对应的URL标识.。

接口URL

传统接口是?后面跟参数的格式,比如:http://localhost:8080/api/get_list?id=1 。RESTful风格使用/来代替了?,比如:http://localhost:8080/api/get_list/1

RESTful 风格一个接口就会完成 增删改差 他是通过不同的请求方式来区分的

  • 查询GET
  • 提交POST
  • 更新 PUT PATCH
  • 删除 DELETE

在这里插入图片描述
比如直接请求http://localhost:5000/user,执行的是@Get()
在这里插入图片描述
请求http://localhost:5000/user/1,执行的是@Get(':id')
在这里插入图片描述
nest会根据路由自动进行匹配。

RESTful 版本控制

一共有三种我们一般用第一种 更加语义化。常用在新切分支,对代码进行改动时使用。

URI Versioning版本将在请求的 URI 中传递(默认)
Header Versioning自定义请求标头将指定版本
Media Type Versioning请求的Accept标头将指定版本

main.ts

import { NestFactory } from '@nestjs/core';
import { VersioningType } from '@nestjs/common';
import { AppModule } from './app.module';
 
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableVersioning({
    type: VersioningType.URI,
  })
  await app.listen(3000);
}
bootstrap();

controller文件

@Controller({
  path: 'user',
  version: '2',
})

设置之后请求的url必须要添加版本,否则会404
在这里插入图片描述
在这里插入图片描述
如果只是单独修改某几个接口,就不要直接修改Controller 装饰器,只需要单独修改某一个请求就好了。版本控制只会在添加了装饰器的接口生效

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @Get()
  @Version('2')
  findAll() {
    return this.userService.findAll();
  }

在这里插入图片描述
没添加版本装饰器
在这里插入图片描述

注意:比如你的版本是2,那么访问时是v2;如果你的版本写的是v2,访问时就必须是vv2

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

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

相关文章

现代密码学导论-4-完美保密及其三个等价定义

目录 完美保密 Perfectly Secret Encryption 2.1 完美保密的定义 DEFINITION 2.3 完美保密加密方案的定义 LEMMA 2.5 完美保密方案的等价定义(一) 证明引理2.5与定义2.3等价 完美不可区分性 不可区分实验 The adversarial indistinguishability experiment DEFINITION …

基于微信小程序的家校通系统-JAVA【数据库设计、源码、开题报告】

第一章 绪 论 1.1选题背景 随着网络时代的到来,互联网的优势和普及时刻影响并改变着人们的生活方式。在信息技术迅速发展的今天,计算机技术已经遍及全球,使社会发生了巨大的变革。 为了不受时间和地点的限制,智能手机用户可以通…

MySQL学习笔记-----Navicat设置建表

1.数据库字段设置 id 主要设置有bigint 和int两种 长度一般都是20 字符 主要设置 varchar 长度 我一般设置 255 时间 主要是设置为timestamp 混合日期和时间值,时间戳 ,建议在java端的DTO或者request设置时间格式 判断状态 比如mybatis-pl…

宋祖德六评岳云鹏,大饼脸、文化低、总有一句能戳中你的内心

都知道娱乐圈有一个纪委书记,那就是万达的公子王思聪,其实在郭德纲的北京德云社,也有一位义务纪委书记。著名导演宋祖德,就是德云社的纪委书记,这些年他把所有的重心,都放在了约束德云社上面。 俗话说&…

Mysql优化-经验分享

目录什么是索引索引类型主键索引唯一索引组合索引前缀索引全文索引空间索引索引的数据结构HASH表二叉树平衡二叉树红黑树B树B树索引的存储引擎MyISAMInnoDB索引优化方向分层SQL优化表设计三范式索引合理使用服务器优化内存升级碎片优化工具的使用explainshow processlistshow p…

基于单片机的音乐盒

本设计是基于单片机的音乐盒,主要实现以下功能: 1,可通过按键控制音乐的选择、声音的大小和开始/停止播放; 2,通过MP3模块播放音乐; 3,可通过蓝牙连接手机,用手机远程控制&#xff…

书法比赛评分系统-JAVA【数据库设计、源码、开题报告】

1 引言 1.1 选题背景及意义 书法艺术,是中国的国粹;是经过数千年历史积淀和先哲们上下求索而形成的灿烂的文化瑰宝;是囊括了人与天地之间的大学问;是中华民族智慧的结晶;是最具中国特色的文化艺术门类。它不仅在中国,而且在世界上也享有极高的荣誉&…

Spring Boot 自定义配置元数据

Spring Boot 自定义配置元数据 概述 开发Spring Boot应用程序时, 可以把 application.properties文件中的配置属性直接转换为 Java Bean对象。这也是Spring Boot 约定大于配置的理念的体现,通过框架内置的各种属性按照不同的需求进行排列组合,满足特定…

Spring Boot Admin2 @EnableAdminServer的加载

其他相关文章&#xff1a; 1、Spring Boot Admin 参考指南 2、SpringBoot Admin服务离线、不显示健康信息的问题 首先根据官网的“快速开始”&#xff0c;快速搭建一个Spring Boot Admin Server项目 1、添加Spring Boot Admin启动器到依赖 pom.xml <dependency><grou…

低代码会使初级码农失业吗?

低代码的目的是提升效率&#xff0c;不是压榨生存空间。低代码不代表低技术&#xff0c;所以低代码并不会导致初级码农失业&#xff0c;实际上不仅不会导致失业&#xff0c;还帮助更多人走上了“开发者”岗位。 何为低代码&#xff1f; 所谓“低代码”&#xff08;Low-Code&a…

day29 SQL注入增删改查盲注延时布尔报错

前言 #知识点&#xff1a; 1、明确查询方式注入Payload 2、明确查询方式注入产生功能 3、明确SQL盲注延时&布尔&报错 #详细点&#xff1a; 盲注就是在注入过程中&#xff0c;获取的数据不能回显至前端页面。 此时&#xff0c;我们需要利用一些方法进行判断或者尝…

基于JAVA的房屋租赁系统平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427640 租户在租房过程中如何才能保护自己的合法权益? 出租方在租房过程中又如何证明房屋的所属关系?种种租赁相关话题&#xff0c;成了当下关注的民生热点&#xff0c;为了切实解决人民群…

BUUCTF Reverse/[GXYCTF2019]simple CPP

BUUCTF Reverse/[GXYCTF2019]simple CPP 先看文件信息&#xff0c;是个64位的程序&#xff0c;且没有加壳 IDA64位打开 int __cdecl main(int argc, const char **argv, const char **envp) {bool v3; // si__int64 v4; // rax__int64 v5; // r8__int64 v6; // r8unsigned __in…

【ESP32_8266_MQTT篇】

文章目录MQTT介绍1 MQTT历史2 MQTT版本MQTT介绍 MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范&#xff0c;易于实现。这些特点使得它对很多场景来说都是很好的选择&#xff0c;特别是对于受限的环境如机器与机器的通信&…

Java面向对象的特点之:继承

对于继承&#xff0c;当大家看到这个词语的时候&#xff0c;在现实生活中&#xff0c;想必也会自然而然的想到了&#xff1a;继承家产&#xff1f;&#xff1f;那么&#xff0c;在Java的面向对象的时候&#xff0c;也存在这样的思想&#xff01;&#xff01; 下面笔者来带领大…

【ASM】字节码操作 工具类与常用类 LocalVariablesSorter 源码介绍以及原理介绍

文章目录 1.概述2. LocalVariablesSorter#2.1 class info2.2 fields2.3 constructors2.4 methods2.4.1 newLocal method2.4.2 local variables method3.工作原理3.1 添加新変量3.2处理旧变量4.总结1.概述 在上一节文章中:【ASM】字节码操作 工具类与常用类 LocalVar

深度学习入门——基于TensorFlow的鸢尾花分类实现(TensorFlow_GPU版本安装、实现)

基于TensorFlow的鸢尾花分类实现0 引言1 基本介绍和环境搭建1.1关于TensorFlow-GPU环境搭建第一步:安装Anaconda&#xff1a;第二步&#xff1a;安装GPU版本需要&#xff0c;明确显卡型号第三步&#xff1a;打开conda终端建立Tensorflow环境第四步&#xff1a;激活虚拟环境&…

最简单例子解释python的transpose函数

二维数组的transpose就是矩阵的转置&#xff0c;这里直接略过。直接讨论三维情况。 首先&#xff0c;我们要弄清楚transpose的轴是什么意思&#xff1f; 0是代表了第一个轴&#xff0c;1是代表了第二个轴&#xff0c;2是代表了第三个轴&#xff0c;这里我们用x&#xff0c;y&…

基于PHP+MySQL米步童鞋商城网站的设计与实现

随时时代的发展,更多的宝妈们希望给宝宝买鞋子的时候能够通过更加简单方便的方式来进行,因为宝妈每天都要面对很多的时候,不能够经常到商场闲逛,所以她们急需一种通过互联网的方式来购买童鞋,所以我们通过PHP语言和MySQL数据开发了米步童鞋商城网站 米步童鞋商城网站的主要功能…

认识JUC

JUC 一、Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent &#xff08;简称 JUC &#xff09;包&#xff0c;在此包中增加了在并发编程中很常用 的实用工具类&#xff0c;用于定义类似于线程的自定义子 系统&#xff0c;包括线程池、异步 IO 和轻量级任务框架。 提供…