备案 控制台
开发者社区 开发与运维 文章 正文

使用NestJS搭建服务端应用(上)

简介: 使用NestJS搭建服务端应用(上)

前言


最近有个需求需要基于前端技术栈实现一套中间层API接口,用于处理由前端维护的一套JSON配置文件。


经过一番查找后,最终选择了nest.js这个框架,由于它支持AOP编程,与SpringBoot的写法较为相似,可以将SpringBoot那套架构思想应用过来,这对于我这个全干工程师(懂亿点点Java)来说就非常友好了😁


经过3天的学习与折腾,终于搭建了一套我比较满意的架构,本文就跟大家分享下我的架构方案,欢迎各位感兴趣的开发者阅读本文。


写在前面


本文所讲内容会涉及到TypeScript,如果你对它还不够理解,请先移步:TypeScript中文文档学习下,入个门🤓。


  • 本文完整项目代码移步:nest-project


  • 本文中所安装的依赖包要求你的node版本必须在14.16.0及以上。


你可以使用node版本管理控制器n来管理你的node版本,你可以使用npm install -g n来安装它。

安装完成后,你只需使用n 版本号即可安装并切换到对应版本的node了。macos下使用可能需要使用sudo n 版本号。例如:n 14.16.0

有关n的更多使用方法请移步:n-github


环境搭建


在nest官网中,它提供了三种搭建方式:


  • 使用CLI安装
  • 使用Git安装
  • 手动创建


这三种安装方式都比较简单,感兴趣的开发者可自行查阅文档来了解学习。为了锻炼大家的动手能力,本文不采用上述方法来搭建项目,我们将从0开始使用yarn初始化一个空项目,然后安装nest的相关依赖包。


注意:如果你已经搭建好了环境,请跳过此章节,前往下一个章节:项目架构。


初始化一个空项目


本文使用yarn来初始化项目,如果你没有安装的话需要先使用npm来安装下,命令如下:


  • npm install --global yarn

安装完成后,可以使用命令:yarn --version 来验证下是否安装成功,如果成功你会看到如下所示的输出:


640.png

                                 image-20220111215750509


接下来,我们创建一个名为nest-project的空文件夹,在终端进入这个文件夹,使用命令:yarn init来初始化一个项目,如下所示,根据自己的需要填写即可,带括号的部分可以不填写保持默认,直接回车即可。


640.png

                                image-20220111222505312


随后,我们打开这个项目,文件夹中只有一个package.json文件,内容如下所示:


{
  "name": "nest-project",
  "version": "1.0.0",
  "main": "index.js", // 这个可以删除,不需要这个字段
  "author": "likai",
  "license": "MIT",
  "private": true
}


上述内容就是我们刚才在终端所选择的,因此你也可以自己创建一个空文件,创建这个json文件,写上对应的配置,达到相同的结果。


安装nest依赖包


我们打开刚才创建的package.json文件,添加如下所示的字段:


{
  "dependencies": {
    "@nestjs/common": "^8.1.1",
    "@nestjs/core": "^8.1.1",
    "@nestjs/platform-express": "^8.1.1",
    "class-transformer": "^0.5.1",
    "class-validator": "^0.13.2",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.4.0"
  },
  "devDependencies": {
    "@nestjs/cli": "^8.1.3",
    "@nestjs/schematics": "^8.0.4",
    "@types/express": "^4.17.13",
    "@types/node": "^16.11.1",
    "supertest": "^6.1.6",
    "ts-loader": "^9.2.6",
    "ts-node": "^10.3.0",
    "tsconfig-paths": "^3.11.0",
    "tslib": "^2.3.0",
    "typescript": "^4.4.4",
    "webpack": "5.0.0"
  }
}


随后,我们打开终端,进入项目目录,执行yarn install 命令,成功后的界面如下所示:


640.png

                                  image-20220111225541175


安装代码规范依赖包


本文采用eslint和prettier来规范代码,对此不了解的开发者请移步我的另一篇文章:独立使用ESLint+Prettier对代码进行格式校验。


接下来,我们打开前面所创建的package.json文件,在devDependencies对象中添加下述代码:


{
  "devDependencies": {
    "eslint": "^7.0.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^3.3.1",
    "prettier": "^2.2.1",
    "@typescript-eslint/eslint-plugin": "^4.18.0",
    "@typescript-eslint/parser": "^4.18.0",
  }
}


添加完成后,执行yarn install就完成了依赖包的引入。


添加启动命令


安装完所有依赖后,接下来我们在package.json中添加6个运行脚本,用于项目的启动与打包构建,如下所示:


  • prebuild 移除dist目录
  • build 打包项目
  • start 启动项目
  • start:dev 启动项目(支持热更新)
  • start:debug 以debugger模式启动项目(支持断点调试)
  • start:prod 启动打包后的项目


{
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main"
  }
}


添加配置文件


接下来,我们还需要在项目根目录添加nest、eslint、prettier等配置文件,如下所示:


  • .editorconfig统一不同操作系统之间的代码格式相关问题的配置文件
  • .eslintrc.js eslint的配置文件
  • .gitignore git提交时需要忽略的文件
  • .prettierrc.json prettier的配置文件
  • nest-cli.json nest的配置文件
  • tsconfig.json typescript的配置文件
  • tsconfig.build.json 项目打包时ts文件的相关处理配置文件


具体的文件内容,点击上方蓝色字体可直接跳转到GitHub中对应的文件。


项目架构


本章节将跟大家下分享我的项目架构,首先在项目根目录创建src文件夹,所有项目代码将存放在此目录下。


本章节节对应的的完整项目代码移步:nest-project


控制层


这一层用于处理客户端传入的请求以及向客户端返回响应,所有的请求映射都会在这一层来实现。每个请求会对应一个控制器,一个控制器中可以有多个子方法用于处理同类型的不同操作。


举例说明


接下来,我们在src目录下创建controller文件夹,在其目录下新建一个AppController.ts文件。


我们从一个例子入手:


  1. 处理/home/setTitlepost请求,它的参数在http body中
  2. 处理/home/getTitleget请求,它的参数在请求url中


实现代码


翻阅官方文档后,我们就可以写出如下所示的代码:


import { Body, Controller, Get, Query, Post } from "@nestjs/common";
@Controller("home")
export class AppController {
  @Post("setTitle")
  setTitle(@Body() data: { id: number; title: string }): {
    code: number;
    data: null | string;
    msg: string;
  } {
    // 客户端传入的数据
    console.log(data);
    // 返回给客户端的数据
    return { code: 0, data: null, msg: "post方法调用成功" };
  }
  @Get("getTitle")
  getTitle(@Query("id") id: number): {
    code: number;
    data: string;
    msg: string;
  } {
    console.log("客户端传入的数据", id);
    return { code: 0, data: null, msg: "get方法调用成功" };
  }
}


我们来看下上述代码中各个装饰器的作用:


  • @Controller 用于标识此文件是一个控制器,它接受一个参数,此处我写了home,代表所有/home的请求都会进到这里。
  • @Post 用于处理post格式的请求,它也接受一个参数,此处我写了setTitle,代表/home/setTitle的post请求会进到这里。
  • @Body用于获取http body中的数据
  • @Query用于获取请求url中的数据


在nest文档中,它提供的装饰器还有很多,可以应付各种开发场景,详情请移步:控制器- request。


服务层


服务层用于处理具体的业务逻辑,当我们收到客户端的请求后,取出参数编写具体的业务代码。


举例说明


接下来,我们在src目录下创建service文件夹,在其目录下新建一个AppService.ts文件。


举个例子:


  • 写一个方法,根据id来做一些事情,做完后返回操作结果。


实现代码


查阅文档后,我们知道了需要使用@Injectable()来装饰这个类,代码如下所示:

import { Injectable } from "@nestjs/common";
@Injectable()
export class AppService {
  public setTitle(id: string): {
    code: number;
    data: null | string;
    msg: string;
  } {
    // 根据id做一些事情,此处省略
    console.log(id);
    // 返回操作结果
    return { code: 0, data: null, msg: "设置成功" };
  }
}


做完上述操作后,我们还需要改造下AppController,在constructor中引入我们刚才创建好的service,部分代码如下所示:


export class TextAttributeController {
  constructor(private readonly appService: AppService) {}
  @Post("setTitle")
  setTitle(){
    // 此处省略了较多代码,这里的重点是演示如何调用我们刚才写好的方法
    return this.appService.setTitle();
  }
}


一个service类中会有很多方法,我们会根据控制层的映射建立与之对应的处理方法

,这样就可以让控制层更专心的处理它的分内之事,提升代码可读性。


接口层


这一层用于声明每个service类中都有哪些方法,可以很大程度提升代码的可读性。如果没有这一层,当service中的方法越来越多时,代码也会特别长,想快速找到某个方法,将会变得很费时。


举例说明


接下来我们在src目录下创建interface文件夹,在其目录下新建一个AppInterface.ts文件。


举个例子,我们需要在声明5个方法,分别如下所示:


  1. getTitle
  2. getName
  3. getAge
  4. setName
  5. setTitle


实现代码


在TypeScript中用interface关键字来声明一个接口,那么上述例子转换为代码后就如下所示:


export interface AppInterface {
  getTitle(): string;
  getName(): string;
  getAge(): string;
  setName(): string;
  setTitle(): string;
}


做完上述操作后,我们还需要改造下service层的代码,让其实现这个接口,部分代码如下所示:


@Injectable()
export class AppService implements AppInterface {
  getAge(): string {
    return "";
  }
  getName(): string {
    return "";
  }
  //  其他方法省略
}


在TypeScript中,我们使用implements关键字来实现一个接口。

神奇的程序员
目录
相关文章
老板这功能得加钱
|
30天前
|
消息中间件 前端开发 JavaScript
【前端】websocket 讲解与项目中的使用
【前端】websocket 讲解与项目中的使用
老板这功能得加钱
46 0
怒放de生命
|
1月前
|
移动开发 JavaScript 网络协议
SpringBoot:Netty-SocketIO + VUE:SocketIO实现前后端实时双向通信
SpringBoot:Netty-SocketIO + VUE:SocketIO实现前后端实时双向通信
怒放de生命
191 0
wljslmz
|
1月前
|
缓存 中间件 API
流行的几种API接口模式:RESTful、GraphQL、gRPC、WebSocket、Webhook
【2月更文挑战第9天】
wljslmz
126 0
流行的几种API接口模式:RESTful、GraphQL、gRPC、WebSocket、Webhook
力不竭战不止
|
前端开发 JavaScript Java
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
力不竭战不止
770 1
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
游客renxdt7j7326a
|
10月前
|
JavaScript 前端开发 Java
带你入门——如何在nestjs中体验websocket
带你入门——如何在nestjs中体验websocket
游客renxdt7j7326a
762 1
wljslmz
|
10月前
|
开发框架 JavaScript 前端开发
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
wljslmz
220 0
叫我默语
|
11月前
|
前端开发 JavaScript 网络协议
集成websocket实现实时通信(ruoyi 使用笔记)
集成websocket实现实时通信(ruoyi 使用笔记)
叫我默语
797 1
小目标青年
|
消息中间件 缓存 前端开发
Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)
Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)
小目标青年
1730 1
Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)
洲的学习日记
|
前端开发 Python
Flask学习与实战11:WebSocket的使用与简单通信
用这个协议最方便的就是,服务器主动向客户端推送信息。客户端也可以主动向服务器发送信息。属于应用层协议,在握手阶段还是使用了HTTP的协议。
洲的学习日记
530 0
Flask学习与实战11:WebSocket的使用与简单通信
神奇的程序员
|
JSON 前端开发 JavaScript
使用NestJS搭建服务端应用(下)
使用NestJS搭建服务端应用(下)
神奇的程序员
293 0
使用NestJS搭建服务端应用(下)

热门文章

最新文章

  • 1
    优酷中后台前端解决方案-总览
  • 2
    流计算风云再起 - PostgreSQL携PipelineDB力挺IoT(物联网), 大幅提升性能和开发效率
  • 3
    PyODPS 安装常见问题解决
  • 4
    读取excel文件后计算指定行列笛卡儿积并写出
  • 5
    Hibernate 里一些常用操作
  • 6
    10.2-10.3 datetime与时间格式的相互转换
  • 7
    Netty重要概念介绍
  • 8
    联想确认再次裁员 称调整主要分布在海外
  • 9
    阿里2016财报:强调正全力发展云计算等为四大业务
  • 10
    STL - 常用关联容器代码 - set & multiset
  • 1
    基于SpringBoot+Vue+uniapp的民宿预订系统的详细设计和实现(源码+lw+部署文档+讲解等)
    41
  • 2
    《500 Lines or Less》(13)—— A 3D Modeller
    35
  • 3
    基于SpringBoot+Vue+uniapp的电子书阅读器系统的详细设计和实现(源码+lw+部署文档+讲解等)
    29
  • 4
    基于SpringBoot+Vue的母婴全程服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    34
  • 5
    基于SpringBoot+Vue的招投标管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    31
  • 6
    基于SpringBoot+Vue的失物招领系统的详细设计和实现(源码+lw+部署文档+讲解等)
    28
  • 7
    基于SpringBoot+Vue的高校科研信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    28
  • 8
    基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现
    30
  • 9
    基于SpringBoot+Vue+uniapp的课程考勤及作业提交App的详细设计和实现
    25
  • 10
    基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现
    27
  • 相关电子书

    更多
  • 低代码开发师(初级)实战教程
  • 冬季实战营第三期:MySQL数据库进阶实战
  • 阿里巴巴DevOps 最佳实践手册
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司平湖seo网站推广公司营口高端网站设计哪家好诸城如何制作网站推荐黄冈网站搭建推荐海北网站优化排名推荐坪地企业网站改版推荐漳州关键词按天收费多少钱白城网站推广工具公司邵阳百搜标王推荐坪地网站优化排名邯郸网站seo优化新乡网站优化推广价格湘潭优秀网站设计公司同乐企业网站建设价格上海网站优化公司西安网站搭建公司丽江网站开发公司包头seo排名珠海设计公司网站价格延边模板网站建设布吉网络推广多少钱昭通网站推广方案价格赤峰网站设计模板推荐南通网站推广系统报价滨州网站优化推广多少钱南京网站改版报价东莞SEO按效果付费公司通辽百度网站优化报价临汾企业网站制作价格莱芜网站建设价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化