Nestjs框架快速入门:安装与启动
Nest 是构建高效可扩展的 Node.js Web 应用程序的框架。
Nest 默认使用JavaScript的超集TypeScript
进行开发。
环境准备
查看node和npm版本:
$ node --version
v10.11.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.3.0
added 60 packages from 29 contributors,
removed 10 packages,
updated 119 packages
and moved 1 package in 102.136s
使用nest --version
命令查看nest当前版本:
$ nest --version
6.3.0
使用nest new
命令创建一个名为 nest-quick-start 的项目:
$ nest new nest-quick-start
We will scaffold your app in a few seconds..
CREATE /nest-quick-start/.prettierrc (51 bytes)
CREATE /nest-quick-start/README.md (3370 bytes)
CREATE /nest-quick-start/nest-cli.json (84 bytes)
CREATE /nest-quick-start/nodemon-debug.json (163 bytes)
CREATE /nest-quick-start/nodemon.json (132 bytes)
CREATE /nest-quick-start/package.json (1663 bytes)
CREATE /nest-quick-start/tsconfig.build.json (89 bytes)
CREATE /nest-quick-start/tsconfig.json (300 bytes)
CREATE /nest-quick-start/tslint.json (426 bytes)
CREATE /nest-quick-start/src/app.controller.spec.ts (617 bytes)
CREATE /nest-quick-start/src/app.controller.ts (274 bytes)
CREATE /nest-quick-start/src/app.module.ts (249 bytes)
CREATE /nest-quick-start/src/app.service.ts (142 bytes)
CREATE /nest-quick-start/src/main.ts (208 bytes)
CREATE /nest-quick-start/test/app.e2e-spec.ts (561 bytes)
CREATE /nest-quick-start/test/jest-e2e.json (183 bytes)
? Which package manager would you ❤️ to use? npm
✔ Installation in progress... ☕️
? Successfully created project nest-quick-start
? Get started with the following commands:
$ cd nest-quick-start
$ 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-quick-start
$ npm run start
> nest-quick-start@0.0.1 start /Users/cnwyt/development/nestjs/nest-quick-start
> ts-node -r tsconfig-paths/register src/main.ts
[Nest]28472 - 2019-05-02 15:45 [NestFactory] Starting Nest application...
[Nest]28472 - 2019-05-02 15:45 [InstanceLoader] AppModule dependencies initialized +15ms
[Nest]28472 - 2019-05-02 15:45 [RoutesResolver] AppController {/}: +7ms
[Nest]28472 - 2019-05-02 15:45 [RouterExplorer] Mapped {/, GET} route +4ms
[Nest]28472 - 2019-05-02 15:45 [NestApplication] Nest application successfully started +3ms
查看运行结果:
(1) 打开浏览器,访问 http://localhost:3000/
就可以看到Hello World!
页面输出了。
(2) 直接在终端查看,使用curl命令请求 localhost:3000
,
$ curl localhost:3000
Hello World!%
可以看到正常输出 Hello World!
。
项目结构
项目在哪里输出的Hello World!
呢,我先看下项目的目录结构。
在终端,我们可以使用 tree 命令查看 nest-quick-start 的目录结构:
nest-quick-start
├── README.md
├── nest-cli.json
├── node_modules/
├── nodemon-debug.json
├── nodemon.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
└── yarn.lock
可以看到,和 Angular
项目的目录结构非常像。
项目的入口文件是 main.ts
, 定义了一个异步方法(bootstrap)来启动应用,默认监听端口3000
:
// src/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
// src/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();
}
}
控制器文件src/app.controller.ts
中定义了一个getHello
方法,使用@Get()
进行路由注解。
在getHello
方法中,调用了 appService 中的getHello
方法,因此返回了我上边输出的 Hello World!
字符串。
// app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
写一个获取当前接口版本的方法
现在,我们来自定义一个返回当前版本的接口,获取当前应用的版本:
在控制器 app.controller.ts
新增getVersion
方法,使用 @Get('/version')
路由注解,表示访问 ‘/version’ 会调用该方法。修改后代码如下:
// src/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();
}
// 自定义 getVersion 方法:
@Get('/version')
getVersion(): Object {
return this.appService.getVersion();
}
}
在服务类 app.service.ts
中新增 getVersion
方法,用来返回内容,返回格式为 Object
。
修改后代码如下:
// app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
// 自定义:获取版本
getVersion(): Object {
return {
code: 200,
msg: "",
data: {
version:"0.0.1"
},
}
}
}
使用 Control+C 结束终端运行,这次我们使用 npm run start:dev
启动(项目文件有修复会自动重启):
$ npm run start:dev
> nest-quick-start@0.0.1 start:dev /Users/cnwyt/development/nest-quick-start
> nodemon
[nodemon] 1.19.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: /Users/cnwyt/development/nest-quick-start/src/**/*
[nodemon] starting `ts-node -r tsconfig-paths/register src/main.ts`
[Nest]71200 - 2019-05-02 17:06 [NestFactory]Starting Nest application...
[Nest]71200 - 2019-05-02 17:06 [InstanceLoader]AppModule dependencies initialized +24ms
[Nest]71200 - 2019-05-02 17:06 [RoutesResolver]AppController {/}: +34ms
[Nest]71200 - 2019-05-02 17:06 [RouterExplorer]Mapped {/, GET} route +9ms
[Nest]71200 - 2019-05-02 17:06 [RouterExplorer]Mapped {/, GET} route +2ms
[Nest]71200 - 2019-05-02 17:06 [NestApplication]Nest application successfully started +5ms
...
访问 http://localhost:3000/version
, 输出json字符串内容:
{
"code": 200,
"msg": "",
"data": {
"version": "0.0.1"
}
}
如果输错地址,框架会有如下404提示:
{
"statusCode": 404,
"error": "Not Found",
"message": "Cannot GET /version2"
}
参考链接
https://docs.nestjs.com/first-steps
感谢阅读,如有问题请留言。
更新记录
2018-12-18: 新增本文档,使用nestjs 5.7.1 版本。
2019-05-02: 修改内容,并更新 nestjs 至 6.3.0版本。
[END]