参考Nest中文文档
启动项目
全局安装Nest.js
脚手架,然后利用脚手架创建一个新项目指令如下所示:
$ npm i -g @nestjs/cli$ nest new my-project-name
要使用 TypeScript 的 更严格 功能集创建新项目,请将 --strict 标志传递给 nest new 命令。
如下所示:nest new [my-project-name] --strict
项目文件
打开刚刚创建的项目文件,展开如下图所示:
├── my-test
│ ├── src
│ │ ├── app.controller.spec.ts
│ │ ├── app.controller.ts
│ │ ├── app.module.ts
│ │ ├── app.service.ts
│ │ └── main.ts
│ ├── test
│ │ ├── app.e2e-spec.ts
│ │ └── jest-e2e.json
│ ├── package.json
│ ├── README.md
│ ├── tsconfig.json
│ ├── …
文件名 | 说明 |
---|---|
app.controller.spec.ts | 控制器的单元测试。 |
app.controller.ts | 具有单一路由的基本控制器。 |
app.module.ts | 应用的根模块。 |
app.service.ts | 具有单一方法的基本服务。 |
main.ts | 使用核心函数 NestFactory 创建 Nest 应用实例的应用入口文件。 |
test/* | 模块的单元测试文件。 |
启动项目需要热更新的可以运行指令
"start:dev"
。
创建一个控制器
$ nest g controller [name]
要使用 CLI 创建控制器,只需执行 $ nest g controller [name] 命令即可。
为了避免生成测试文件,你可以传递 --no-spec 标志,如下所示:nest g resource [name] --no-spec
// cats.controller.ts
import { Controller, Get, Post } from '@nestjs/common';@Controller('cats')
export class CatsController {@Post()create(): string {return 'This action adds a new cat';}@Get()findAll(): string {return 'This action returns all cats';}
}
Nest 为所有标准的 HTTP 方法提供装饰器:@Get()、@Post()、@Put()、@Delete()、@Patch()、@Options() 和 @Head()。
状态码
// code.controller.ts
import { Controller, HttpCode, Post } from '@nestjs/common';@Controller('code')
export class CodeController {@Post()@HttpCode(204)create() {return 'This action adds a new cat';}
}
重定向
// redirect.controller.ts
import { Controller, Get, Redirect } from '@nestjs/common';@Controller('redirect')
export class NofoundController {@Get()@Redirect('/')redirectToNewRoute() {}
}
使用数据库
本地安装一个MySQL,然后启动数据库服务,为了方便演示,使用phpStudy这个集成环境;
在项目安装访问数据库的模块:
$ npm install --save @nestjs/typeorm typeorm mysql2
安装过程完成后,我们可以将 TypeOrmModule 导入到根 AppModule 中。
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';@Module({imports: [TypeOrmModule.forRoot({type: 'mysql',host: 'localhost',port: 3306,username: 'root',password: 'root',database: 'test',entities: [],synchronize: true,}),],
})
export class AppModule {}
以上链接数据库的方式可通过配置
config
,使用环境变量传递,如下所示:
DATABASE_USER=root
DATABASE_PASSWORD=root
实现一个新增接口
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { DataSource, Repository } from 'typeorm';@Injectable()
export class UserService {constructor(@InjectRepository(User)private usersRepository: Repository<User>,private dataSource: DataSource,) {}async create(createUserDto: CreateUserDto) {const { firstName, lastName, isActive } = createUserDto;try {await this.usersRepository.createQueryBuilder('user').insert().into(User).values([{ firstName, lastName, isActive: !!Number(isActive) }]).execute();return {code: '200',data: '',msg: 'success',};} catch (error) {return {code: 'E500',data: JSON.stringify(error),msg: 'error',};}}
}
实现一个查询列表接口
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { DataSource, Repository } from 'typeorm';@Injectable()
export class UserService {constructor(@InjectRepository(User)private usersRepository: Repository<User>,private dataSource: DataSource,) {}async findAll(): Promise<UserList> {const data = await this.usersRepository.createQueryBuilder('user').getMany();return {data,code: '200',msg: 'success',};}}
}
使用数据源查阅TypeORM