引言
这是NestJS
学习的第一步,关于项目的搭建,以及环境的配置,这里使用的包管理工具是pnpm
创建项目
创建项目,直接使用官方的CLI
进行搭建即可:
- 全局安装脚手架
pnpm add -g @nestjs/cli
- 通过脚手架创建项目
nest new nest-basic
出现选择哪个包管理工具选项,这里我选择pnpm
,回车后就会创建项目了呢,目录结构如图
.controller
:控制器:用来分路由,提供接口.service
:服务层:完成一些逻辑层.module
:模块:使用模块或者暴露当前未其他模块使用.spec
:一些测试文件
- 除了
new
命令,nest
脚手架还提供了如下的常用命令,帮助我们快速创建模板-
创建一个
curd
模板
nest g resource [name]
如图创建符合某项规范的curd
模板,这里先选择REST API
,即为符合RESTFUL
规范的接口
会在src
目录下,创建一个user
目录,除基础的控制器、服务层、模块外,还包括dto(Data Transfer Object)
数据传输对象:一般为从数据库中的检索数据entity
数据实体对象:对应数据的表结构
-
单独创建一个控制器、服务层等,具体可看官网内容 nest脚手架使用
-
环境配置
环境配置方便我们在不同的环境中,获取到不同的配置内容,如数据库信息,NestJS
为我们提供了配置模块,结合cross-env
与js-yaml
就可以根据环境读取yaml
文件中的配置内容
pnpm add -D @nestjs/config js-yaml @types/js-yaml cross-env
配置数据,可能会在多个地方进行使用,所以可以把他抽取到一个shared
模块中,需要使用时引入这个模块就行
- 修改
package.json
脚本命令
"start:prod": "cross-env NODE_ENV=production node dist/main",
"start:dev": "cross-env NODE_ENV=development nest start --watch",
在入口文件中打印一下NODE_ENV
// main.ts
async function bootstrap() {
console.log('======', process.env.NODE_ENV);
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
环境已经成功配置了
2. 创建shared
目录,并添加shared
模块
import { Module } from '@nestjs/common';
@Module({})
export class SharedModule {}
shared
目录下创建config
目录,读取环境数据,并加入创建config
模块
// configuration.ts 根据环境,读取`yaml`文件,并创建加载器
import { load } from 'js-yaml';
import { readFileSync } from 'fs';
import { join } from 'path';
const yamlFile =
process.env.NODE_ENV === 'production' ? 'production.yml' : 'development.yml';
console.log(
'==============',
load(readFileSync(join(process.cwd(), yamlFile), 'utf8')),
);
在main.ts
引入该文件,并使用上述两个命令进行测试,结果如下,能够正确读取文件了
接下来根据读取结果创建一个load
// configuration.ts
export default () => {
return load(readFileSync(join(process.cwd(), yamlFile), 'utf8')) as Record<
string,
any
>;
};
- 同在
config
目录下创建文件config-module.ts
用于配置nestjs/config
// config-module.ts
import { ConfigModuleOptions } from '@nestjs/config';
import configuration from './configuration';
export const ConfigProvier: ConfigModuleOptions = {
isGlobal: true,
load: [configuration],
};
shared module
中进行使用
// shared.module.ts
import { Module } from '@nestjs/common';
import { ConfigProvier } from './config/config-module';
import { ConfigModule } from '@nestjs/config';
@Module({
exports: [ConfigModule],
imports: [ConfigModule.forRoot(ConfigProvier)],
})
export class SharedModule {}
app module
中进行使用
// app.module.ts 引入shared module
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SharedModule } from './shared/shared.module';
@Module({
imports: [SharedModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
// app.controller.ts 中使用
import { ConfigService } from '@nestjs/config';
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly configService: ConfigService,
) {}
@Get()
getHello(): string {
console.log('=============', this.configService.get<string>('test.env'));
return this.appService.getHello();
}
}
访问http://127.0.0.1:3000
,控制台打印
通过这样的方式配置环境之后,在需要使用到配置环境数据时,就只需要和app中使用一样,先在
module
中引入shared
模块,之后使用的地方进行注入即可