首页 > 其他分享 >Nestjs系列(一) Nestjs基础

Nestjs系列(一) Nestjs基础

时间:2024-03-01 14:12:19浏览次数:18  
标签:系列 name res nest 基础 person Nestjs my 模板

快速使用 Nestjs

Nest 项目的文件层级和 JAVA 项目的层级架构较为相似。Nest 项目的层级架构统一由 Controller Module Service 三个模块组成。

  • 安装 nest cli,创建项目
npm install -g @nestjs/cli
nest new [项目名]

项目默认运行至 http://localhost:3000/

  • 当 nest 版本有更新,本地 cli 若需要更新至最新版本
npm update -g @nestjs/cli

Nestjs 常用命令

nest n

nest nnest new的缩写。功能:创建项目模板。
创建项目时,使用的就是 nest new。使用 nest new -h,查看 nest new 的可选命令参数

image

其中 strict 模式对应的 5 个配置项为

{
  "compilerOptions": {
    // 若开启 strict 严格模式,则这五项为 true
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false
  }
}

nest g

nest gnest generate的缩写。功能:生成代码模板。
详细命令可通过 nest g -h 查看

image

常用命令如下

  • nest g controller my 生成控制层名为 my 的 controller 模板,简写 nest g co my
    image
  • nest g module my 生成模块层名为 my 的 moudle 模板,简写 nest g mo my
    image
  • nest g service my 生成服务层名为 my 的 service 模板,简写 nest g s my
    image
  • nest g resource crud 生成CRUD模板名为 crud 的 CRUD 模板,简写 nest g res crud,执行该命令时,可以选择多种风格的 CRUD 模板,常规选择 Rest API
    • crud 的模块相比单个创建的,多了 dto(前后端交互时的参数模板)和 entity(实体类,即数据库字段映射)
    • 同时,该命令创建的模板,其 module 也会自动注入到 app module 中
      image

nest build

nest build -h

image

其中编译打包时的不同选项模式,编译出的文件也不一样。

  • nest build -b webpack(可以直接 nest build --webpack,但该命令已过时,推荐使用 --builder [name]
    image
  • nest build -b tsc
    image

tsc 编译和 webpack 打包的不同点在,tsc 不会做打包,而 webepack 会打包成单文件。

nest-cli.json

nest 的命令选项都可以在 nest-cli.json 文件中进行配置,在命令执行时,会自动读取该文件中已有的配置选项。nest-cli 详细配置

{
  // ...
  "sourceRoot": "src",  // 指定源码目录
  "entryFile": "main",  // 入口文件,默认 main
  "compilerOptions": {
    "deleteOutDir": true, // 每次打包都会先删除 dist 目录
    // 把非 js ts 文件也打包进 dist 文件夹中,但仅支持 src 目录下的资源,非 src 不行
    "assets": [
      // 可使用 include exclude 来进行精准匹配
      { "include": "*.env", "outDir": "dist" }
    ]
  },
  "generateOptions": {
    "spec": false  // 跳过 spec 文件生成(推荐)
  }
}

nest start

常用命令可参考 package.json 中的脚本执行命令。例如 --watch 文件变动自动更新,--debug 调试 debug

nest info

查看项目信息的,系统信息、 node版本、项目依赖的包管理工具版本、nest 的依赖包版本

支持静态资源访问

参考中文官网链接:https://nest.nodejs.cn/recipes/serve-static
安装 @nestjs/serve-static,使用其提供的 ServeStaticModule

pnpm install @nestjs/serve-static

app.module.ts 中导入配置项

// ...
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';

@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', 'client'),
    }),
    // ....
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

rootPath 是指定哪个目录下为静态资源,代码中指定 client 文件夹下的为可访问的静态资源

比如在 client 文件夹下新建 index.html。执行 npm run start:dev 启动项目,访问 http://localhost:3000/client/index.html 即可看到该 html 的内容资源。
注意: 静态资源默认访问的渲染路径(renderPath)就是 /index.html ,比如在 client 文件加下新建 my.html 是访问不到的。

Nest和前端的多种参数类型传输和接收

此处可以新建一个 nest 项目,使用命令快速创建 CRUD 模板,启动项目访问 http://localhost:3000/person/110地址,页面出现 This action returns a #110 person 即为成功。

url 参数

拼接到请求路径的动态参数

@Controller('person')
export class PersonController {
  @Get(':id')
  getUrlParam(@Param('id') id: string) {
    return `urlId=${id}`;
  }
}
<script src="https://unpkg.com/[email protected]/dist/axios.min.js"></script>
<script>
  async function getUrlParam() {
    const res = await axios.get('/person/110');
    console.log(res);
  }
  getUrlParam();
</script>

image

query 参数

多个请求参数以&的方式拼接到 url 上。例如 /api/list?current=1&pageSize=10&name=%E5%85%B3%E9%97%AD,axios 会把中文 encodeURIComponent 转换

@Get('list')
getQuery(
  @Query('current') current: string,
  @Query('pageSize') pageSize: string,
  @Query('name') name: string,
) {
  return { name, current, pageSize };
}

@Get(':id')
getUrlParam(@Param('id') id: string) {
  return `urlId=${id}`;
}
const res = await axios.get('/person/list?name=张三&current=1&pageSize=10',);
console.log(res);

image

注意事项

当 url param 和普通请求地址一起使用时,尽量将 url param 的方法写在最下边,原因是请求时,Nest 自上而下匹配路由,当匹配到动态路由时,可以匹配到,就不再执行后续的路由匹配了。

错误写法示范:

image

body 参数

参数在请求体中,通常用于 post put path 等。

在创建 CRUD 模板时,Nest 贴心的准备了两个 dto 文件(前后端请求体参数实体),在 dto 文件夹下。
Nest 接收时,使用装饰器 @Body,标识为请求体,Nest 会自动解析,和 java 的 Spring 使用相似。

export class CreatePersonDto {
  name: string;
  age: number;
}
import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
import { CreatePersonDto } from './dto/create-person.dto';

@Controller('person')
export class PersonController {
	// ...
	@Post()
	addBody(@Body() createDto: CreatePersonDto) {
	  return createDto;
	}
}
const res = await axios.post('/person', {
  name: '张三',
  age: 20,
});
console.log(res);

image

form-data 文件上传

具体可参考 Nest中文网
安装文件上传的 TS 类型包

pnpm i @types/multer -D
  • FileInterceptor 拦截上传接口,接受两个参数,filename 和 配置项 options(以如下代码举例)
    • 第一个参数是只允许字段名称是 myfile 的上传接口访问,其余不予通过。
    • dest 就是接收时在根目录存放资源的目录名称,项目运行/编译时会自动创建。
  • AnyFilesInterceptor 允许任何字段名称的文件访问,不做限制,调用接口即可响应
  @Post('upload')
  @UseInterceptors(FileInterceptor('myfile', { dest: 'upload' }))
  // @UseInterceptors(AnyFilesInterceptor({ dest: 'upload' }))
  uploadFile(@UploadedFile() file: Express.Multer.File) {
    console.log(file);
    return {
      filename: file.filename,
      originalname: file.originalname,
      msg: '上传成功',
    };
  }

注意: 当使用 AnyFilesInterceptor 时,可以上传成功,但是读取不到 file 数据,为 undefined。

<body>
  <input id="fileControll" type="file" />
</body>
<script src="https://unpkg.com/[email protected]/dist/axios.min.js"></script>
<script>
  const fileInput = document.querySelector('#fileControll');
  fileInput.addEventListener('change', async (event) => {
    const file = event.target.files[0];
    const data = new FormData();
    data.append('myfile', file);

    const res = await axios.post('/person/upload', data);
    console.log(res);
  });
</script>

image

标签:系列,name,res,nest,基础,person,Nestjs,my,模板
From: https://www.cnblogs.com/jsonq/p/18045695

相关文章

  • CentOS基础知识大全
    1.关机(系统的关机、重启以及登出)的命令shutdown-hnow关闭系统(1)init0关闭系统(2)telinit0关闭系统(3)shutdown-hhours:minutes&按预定时间关闭系统shutdown-c取消按预定时间关闭系统shutdown-rnow重启(1)reboot重启(2)logout注销2.查看系统信息的命令a......
  • .net framework基础知识
    目录1.什么是.Net平台、.NET框架2..NET版本3.CLR(公共语言运行时)4.BCL(基础类库)5.FCL(框架类库)3..NET的运行机制6.为什么说.NET是平台无关的7.术语参考:1.什么是.Net平台、.NET框架“平台”(这里指软件技术平台,下面都指的是这个)就是能够独立运行并自主存在,为其所支撑的上层......
  • 编辑器蓝图脚本_基础使用
    介绍编辑器蓝图脚本是一种通过蓝图脚本对虚幻编辑器本身进行操作的脚本系统常常被用于制作各种工具蓝图,以方便开发工作创建方式创建蓝图类时可以根据想要操作的是资产还是场景上实例化的对象来选择相应的工具蓝图使用方式1.确认插件已经启用2.创建工具蓝图后,可以在场景......
  • c#基础 (语言)
    一.c#基础(语言)数据类型:常见的类型有:字符类型:string(字符串,可存汉字),char(字符类型)值类型:int(整数),long(长整型),short(短整数)等布尔类型:true,false浮点型:float(单精度浮点数)、double(双精度浮点数)等。可分为值类型和引用类型值类型:存储在栈上,例如:值类型、浮点型、......
  • c#基础 (语言)
    一.c#基础(语言)数据类型:常见的类型有:字符类型:string(字符串,可存汉字),char(字符类型)值类型:int(整数),long(长整型),short(短整数)等布尔类型:true,false浮点型:float(单精度浮点数)、double(双精度浮点数)等。可分为值类型和引用类型值类型:存储在栈上,例如:值类型、浮点型、......
  • JavaScript基础
    引入方式JavaScript程序不能独立运行,它需要被嵌入HTML中,然后浏览器才能执行JavaScript代码。内部引入写在body结束标签的上方。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content=&......
  • Elasticsearch 系列(三)- ES的基本操作
    本章将和大家分享Elasticsearch的一些基本操作。话不多说,下面我们直接进入主题。一、索引库操作1、settings属性settings属性可以设置索引库的一些配置信息,例如:配置分片数和副本数、配置自定义分词器等。其中分片数量只能在一开始创建索引库的时候指定,后期不能修改。副本数......
  • 基础数据结构->set&&map
    set&&mapBEGIN:惜墨如金set用法#include<bits/stdc++.h>usingnamespacestd;voidthe_map(){map<string,int>ds;stringkis="kis";ds[kis]=2;ds["a+a"]=3;ds["b+"]=4;ds["c-"]=5;//这样就可将这个“数......
  • JAVA基础:引用类型参数传递的相关案例(数组的传递) 方法重载 return关键字
    packagecom.itheima.Method;publicclassMethod6{publicstaticvoidmain(String[]args){int[]arrs=newint[]{2,5,6,4};printArray(arrs);}publicstaticvoidprintArray(int[]arr){if(arr!=null){System.out......
  • Redis基础数据结构
    简单动态字符串SDS在Redis里面字符串随处可见比如//设置一个(key,value)为msg和helloworld的键值对setmsg"helloworld"在这里,msg和helloworld都是一个字符串.Redis自己构建了一个名为SDS(SimpleDynamicString简单动态字符串)的类,用于作为Redis底层字符串的默认实......