介绍
Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。
在底层,Nest使用强大的 HTTP Server 框架,如 Express(默认)和 Fastify。Nest 在这些框架之上提供了一定程度的抽象,同时也将其 API 直接暴露给开发人员。这样可以轻松使用每个平台的无数第三方模块。
安装
- 官网提供了三种方式 cli git 手动 个人还是非常推荐使用cli的。
- 请确保您的操作系统上安装了 Node.js(> = 8.9.0)。
// cli
$ npm i -g @nestjs/cli
$ nest new project-name
// git
$ git clone https://github.com/nestjs/typescript-starter.git project
$ cd project
$ npm install
$ npm run start
// 手动
$ npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata
- 安装完成后 不出意外 你得到了一个极其简单的例子
运行应用程序
- 第一种方式
npm run start
但是此时并不会有热更新 - 第二种方式
npm run start:dev
这才是 打开的正确姿势 - 启动完成后 在浏览器输入本地服务器地址
http://127.0.0.1:3000
不出意外你将看到hellow Word
- 所有可运行命令 均在 package.json 文件 scripts 下
应用模块
- 一个好的应用 模块之间的划分应该是明确的,代码也是一样
- 创建一个模块
- 一个模块通常包含 model ,controller, service 文件
- 输入
nest g controller cats
,执行后,若src目录下没有名为cats
的文件夹,则会创建,然后在其中创建cats.controller.ts
文件,否则将cats.controller.ts
文件,放入到cats
文件夹 - 输入
nest g service cats
, 上同 - 命令行创建的文件 会自动注册到 app.module.ts中
- 写一个自定义请求
- 上边创建完成后,我们得到了一个包含 model ,controller, service 文件的文件夹
cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService]
})
export class CatsModule {}
cats.controller.ts
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service'
// 此时的访问路径为 http://127.0.0.1:3000/cats/getPageList
// cats 对应 @Controller('cats') 的 cats
// getPageList 对应 CatsController 的 @Get('getPageList')
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get('getPageList')
getPageList(): string {
return this.catsService.getPageList();
}
@Post('getPageList')
getPageList(): string {
return this.catsService.getPageList();
}
}
cats.service.ts
import { Injectable} from '@nestjs/common';
@Injectable()
export class CatsService {
getPageList() {
return '这是一个自定义请求';
}
}
接收路由参数
- nest 内部定义了一些装饰器, 如获取 get请求的params 可以这样
import { Controller, Get, Ip, Query, Headers, Post, Param, HttpCode, Body } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('cats')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('test')
getHello(@Param() Param): string {
return this.appService.getHello();
}
}
mysql数据库连接
app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost', // 服务器主机名 本地不用改 或者 127.0.0.1
port: 3306, // 数据库端口 默认 3306
username: 'root', // 数据库用户名
password: 'root', // 数据库密码
database: 'test', // 数据库 存储库
// 注册 数据库实体类 如 photo/photo.entity.ts
// 也可以这样写 "entities": ["dist/**/*.entity{.ts,.js}"], 匹配所有 .entity 文件,
// 或者直接设置 autoLoadEntities: true,
entities: [],
synchronize: true,
}),
],
})
export class AppModule {}
存储库模式
TypeORM 支持存储库设计模式,因此每个实体都有自己的存储库。可以从数据库连接获得这些存储库。为了继续这个示例,我们需要至少一个实体。我们将使用官方TypeORM文档中的 Photo 实体。(拷贝官网)
- 注意: 每个实体类 都对应一个数据库的表, 如果不存在则会创建
photo/photo.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 500 })
name: string;
@Column('text')
description: string;
@Column()
filename: string;
@Column('int')
views: number;
@Column()
isPublished: boolean;
}
app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './photo/photo.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [Photo], // 此处注册实体类
synchronize: true,
}),
],
})
export class AppModule {}
photo.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PhotoService } from './photo.service';
import { PhotoController } from './photo.controller';
import { Photo } from './photo.entity';
@Module({
imports: [TypeOrmModule.forFeature([Photo])],
providers: [PhotoService],
controllers: [PhotoController],
})
export class PhotoModule {}
不要忘记将 PhotoModule 导入根 ApplicationModule。
photo.controller.ts
import { Controller, Get } from '@nestjs/common';
import { PhotoService } from './photo.service';
import { Photo } from './photo/photo.entity';
@Controller('Photo')
export class CatsController {
constructor(private readonly photoService: PhotoService) {}
@Get('findAll')
getPageList(): Promise<Photo[]> {
return this.photoService.findAll();
}
}
photo.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Photo } from './photo.entity';
@Injectable()
export class PhotoService {
constructor(
@InjectRepository(Photo)
private readonly photoRepository: Repository<Photo>,
) {}
findAll(): Promise<Photo[]> {
return this.photoRepository.find();
}
}
- 上述代码 新建额一个 Photo 的模块,请确保其正确注册,然后不出意外,你的数据库 将会多出一个 Photo 的表,试着插入一条数据,然后访问
http://127.0.0.1:3000/Photo/findAll
你将得到该表的全部数据