Clean Architecture在NestJS中的实践(一):项目初始化

在前一篇文章《[ChatGPT]Clean Architecture架构在NestJS中的实现》,SEO禅用ChatGPT生成了一些关于clean architecture的介绍,但是感觉不够通顺,也不够严谨,在这篇文章SEO禅会进行示例介绍,从零开始搭建一个Clean Architecture(简称CA)的NestJS项目,CA中关键的四个点:Entities(不是指代数据库的entity)、Use Cases 业务用例、Interface Adapaters 接口适配器(Controller/Presenter等)、Frameworks & Drivers 框架和驱动,现在不理解没关系,接着往下看,SEO禅用实例来讲解。

初始化项目

首先我们来创建一个NestJS项目,运行nest new project-name生成项目目录结构:

安装依赖完成之后,会有如下目录结构:

我们把app.controller/.spec.tsapp.service.ts这三个文件删除掉,然后创建三个新的目录:

这里介绍下这三个目录的不同:

domain - 对应CA中的entities层,不会依赖外层代码,比如说我们的interface,model,等比较抽象,变动最不频繁的一部分代码。

infrastructure - 基础框架层,对应了我们最外层的Frameworks & Drivers 和 Interface Adapter两层的内容,这里的代码是最经常改动的,比如说我们的service具体实现,数据库实体模型Entity等内容,依赖domain层和usecases层。

usecases - 业务用例层,这一层对应的就是CA中的usecases层了,这里只会出现domain层的代码,而不会出现infrastructure层的代码。

加载项目配置

我们已经创建好基础的项目目录了,如果是传统的后台开发,我们肯定要先配置好Tomcat,Nginx,Mysql这些开发环境,但是这次使用的是NestJS作为后台开发框架,我们运行pnpm run start:dev命令就能进行开发:

但是我们还需要连接数据库,这里SEO禅选择MongoDB作为数据库,在连接数据库前,首先我们来获取下数据库的配置信息,使用@nestjs/config包来载入我们的配置信息:

pnpm i @nestjs/config

安装完成以后,运行如下命令,创建environment-config模块:

nest g mo infrastructure/config/environment-config

environment-config.module.ts中的代码:

@Module({imports: [ConfigModule.forRoot({envFilePath: './env/local.env',ignoreEnvFile: !(process.env.NODE_ENV === 'local' || process.env.NODE_ENV === 'test'),isGlobal: true,}),],
})
export class EnvironmentConfigModule {}

之后我们创建一个文件env/local.env,文件里写入一些配置信息:

再改造下main.ts文件来使用配置信息:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';async function bootstrap() {const app = await NestFactory.create(AppModule);const configService = app.get(ConfigService);const port = configService.get('PORT');console.info(port)await app.listen(port||3000);
}
bootstrap();

现在我们需要改下package.json里的启动命令,来使用配置信息:

"start:dev": "cross-env NODE_ENV=local nest start --watch"

如果在Windows下运行,会报错:

The term 'NODE_ENV=development' is not recognized as the name of a cmdlet, function, script file, or operable program

这里SEO禅使用了cross-env来声明NODE_ENV=local,防止在多平台下报错,安装下这个包:

 pnpm i -D cross-env

之后再重新启动服务器,就能看到输出的PORT参数:

效验项目配置

上面已经可以读到配置文件中的参数信息,那在使用前,我们需要对参数进行效验,防止因为格式错误而导致一些问题,这里SEO禅使用的是自定义效验函数的方法,可以参考官方文档Custom validate function

首先安装下面的两个包:

pnpm i class-transformer class-validator

我们再来创建一个MongoDB的config文件:

export class MongoDBEnvironmentVariables {@IsString()DATABASE_URL: string;
}export const MongoDBEnvironmentConfig =  registerAs('database', (): IMongoDBConfig => {// Executes our custom functionenvironmentValidationUtil(process.env,MongoDBEnvironmentVariables);// If all is valid, this will return successfullyreturn {url: process.env.NODE_ENV,};
});

这里environmentValidationUtil是SEO禅对上面两个包的封装,代码如下:

export function environmentValidationUtil(config: Record<string, unknown>, envVariablesClass: ClassConstructor<any>
) {const validatedConfig = plainToClass(envVariablesClass,config,{ enableImplicitConversion: true },);const errors = validateSync(validatedConfig, { skipMissingProperties: false });if (errors.length > 0) {throw new Error(errors.toString());}return validatedConfig;
}

再把MongoDB的配置加入到config module中的load

现在我们再来运行下nest,你会发现报错了:

 ERROR [ExceptionHandler] An instance of MongoDBEnvironmentVariables has failed the validation:- property DATABASE_URL has failed the following constraints: isString 

这样效验规则就起作用了,我们只要把DATABASE_URL这个参数加入到env\local.env文件中去,然后在main.ts就能调用到了:

  const DATABASE_URL = configService.get('DATABASE_URL');// const DATABASE_URL = configService.get('database.url');  使用命名空间的方式调用console.info('DATABASE_URL:',DATABASE_URL)

因为篇幅有限,介绍Clean Architecture架构在NestJS中实践会分成多个文章来说,这篇文章先介绍初始化项目,下一篇文章会介绍如何使用这些获取到的配置,还有如何使用Docker来实际连接MongoDB数据库。

这个系列文章的代码:clean-architecture-with-nestjs

作者:SEO禅
本文链接:Clean Architecture在NestJS中的实践(一):项目初始化
版权申明:如无特殊说明,本站文章均为作者原创,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10978.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何自学编程?这篇文章给你一条可行之路

今天推荐一本新书《微信小游戏开发&#xff08;前端篇&#xff09;》。请在本文留言评论&#xff0c;公众号将选出最走心的3位小伙伴&#xff0c;每人赠送一本&#xff0c;本活动在 3月1日 12:00 截止。 这本书基于一个精心设计的PBL实战项目&#xff0c;以模拟项目迭代重构的方…

ChatGPT通用人工智能:初心与未来

至少从 20 世纪 50 年代起&#xff0c;人们就开始大肆宣传可能很快就会创造出一种能够与人类智能的全部范围和水平相匹配的机器。现在&#xff0c;我们已经成功地创造出了能够解决特定问题的机器&#xff0c;其准确度达到甚至超过了人类&#xff0c;但我们仍然无法获得通用智能…

丛立先、李泳霖 || 生成式AI的作品认定与版权归属——以ChatGPT的作品应用场景为例...

山东大学学报 本文拟刊发于《山东大学学报&#xff08;哲学社会科学版&#xff09;》2023年第4期&#xff0c;已在中国知网网络首发&#xff0c;欢迎转发与转载&#xff01;转载请注明来源&#xff01; 作者&#xff1a;丛立先&#xff0c;华东政法大学知识产权学院教授&#x…

人工智能学习路线:来自中科院IT大佬的强烈推荐

学习人工智能还是具有一定难度的&#xff0c;一方面人工智能技术对于基础学科的要求相对比较高&#xff0c;另一方面人工智能的很多实验也需要场景&#xff08;数据中心&#xff09;的支撑&#xff0c;所以初学者如果想自学人工智能技术&#xff0c;通常需要经过多个阶段。 以下…

如何成为一名AI算法工程师?

作为计算机科学领域的一个分支&#xff0c;在互联网和大数据的时代浪潮中显现出其巨大的潜力和蓬勃的活力&#xff0c;类似电子医生、无人驾驶等新名词纷纷涌现。 那么&#xff0c;如何才能在时代发展的风口下乘风破浪呢&#xff1f;如何学习人工智能并进一步进阶掌握必备技能要…

一份最最最适合入门的Python+人工智能学习教程资料,免费送给你~

内含多套培训班全套视频&#xff01; 大家都在学Python的时候&#xff0c;怎么才能让自己更有竞争力&#xff1f; Python 的应用方向有很多&#xff0c;基本每个方向都是大热门&#xff0c;但至今为止&#xff0c;人工智能行业仍处于人才稀缺的情况。正因这样&#xff0c;近几…

为什么说Python是人工智能方向的主流编程语言?

为什么那么多人选择学习Python&#xff1f; Python作为一种很高效的语言、一种脚本语言&#xff0c;通过它能编程完成数据收集&#xff0c;还可以批量化自动操作简单任务&#xff0c;代替枯燥的手工操作。 那么为什么不仅小白&#xff0c;对于专业人士来说Python基础打扎实也…

人工智能学习路线:从编程初学者到AI,怎么学习?

人工智能包括现在非常流行的一些网络词语&#xff1a;人工智能->机器学习->深度学习。 怎样学习&#xff1f; 路径一&#xff1a;一步一个脚印&#xff0c;扎扎实实从基础学起&#xff0c;逐步提高学习难度 Step1&#xff1a;了解行业资讯&#xff0c;先来一波科普 所以…

如何进入人工智能行业,适用于初入门的学生、转行或有经验的小伙伴

如果你不是想从事人工智能这个行业&#xff0c;或者是软件开发的行业&#xff0c;那么久没有必要往下看了&#xff0c;没有必要把时间浪费在你不想做的事情上&#xff0c;如果你还想继续往下看&#xff0c;那么说明你还是希望自己能够从事这个行业&#xff0c;这篇文章写想要在…

人工智能行业门槛有多高,有高薪缺人才,供不应求

从自动驾驶到小区人脸识别&#xff0c;人工智能已经逐步渗透到我们日常生活中。 有相关数据显示&#xff0c;2020年&#xff0c;全球人工智能产业规模达到2800亿美元&#xff0c;我国人工智能产业规模也达到了3000亿人民币。随着其在各行业的深度应用&#xff0c;市场对人工智…

新手小白入门AI人工智能 学习路径 知识体系

人工智能入门好难&#xff0c;经常会被问到这个问题。从小白走到现在&#xff0c;总结发现&#xff0c;对于新手来说&#xff0c;需要筑个铁三角来稳固地基&#xff1a;数学基础、编程语言基础、机器学习。有了这些&#xff0c;才算基本具备了入门的条件。 注&#xff1a;分享…

微信公众号接口调用频次限制说明

公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常&#xff0c;默认情况下&#xff0c;每个公众号调用接口都不能超过一定限制&#xff0c;当超过一定限制时&#xff0c;调用对应接口会收到如下错误返回码&#xff1a; {"errcode":45…

获取微信公众号关注总人数和用户列表

工作需要获取公司获取实时公众号总人数&#xff0c;我当时第一反应看管理后台不就行了&#xff0c;想完就觉得有点傻&#xff0c;看管理后台还需要让我些什么呀&#xff01;&#xff01;&#xff01; 然后开始整理思路&#xff0c;想要获取微信公众号管理后台数据&#xff0c;…

微信公众号一次群发多个推文

缘起 个人申请的微信公众号&#xff0c;限制是个人用户一天只能 【群发】 一次&#xff0c;然而&#xff0c;看到别人的订阅号能在一篇文章下面附属多篇推文&#xff0c;这是怎么实现的&#xff1f;如下图。 实现步骤 1. 先搞清楚【群发】和【发布】的区别 发布是不会主动推给…

关注微信公众号后根据不同用户推送不同信息,怎么做到的?

关注公众号后&#xff0c;维信自动给我推送消息。如果我买了电话提醒服务&#xff0c;它会给我推送&#xff0c;如下图所示&#xff1b; 但如果我买了其他服务&#xff0c;它将给我推送我所买的服务&#xff0c;这个是怎么做到的&#xff1f;是属于自动回复吗&#xff1f;是如何…

微信公众号开发中,获取用户资料的两种方式

微信公众号的开发主要是在服务号环境下进行&#xff0c;订阅号是拿不到用户的资料的&#xff0c;因此&#xff0c;下文的讨论都基于微信服务号。 微信公众号的两个access_token 在微信的开发文档中&#xff0c;存在两个access_token&#xff0c;需要对它们加以区别。为了区分…

微信公众号与小程序数据互通

背景 最近做了一个有意思的功能《官网内容订阅》&#xff0c;用户在官网扫码后可以订阅官网栏目&#xff0c;订阅栏目后发送模版消息提醒用户订阅成功&#xff0c;模版消息关联了小程序&#xff0c;然后做了一个小程序来管理用户订阅的栏目&#xff0c;小程序提供订阅和新闻列表…

微信公众号发布消息不消耗群发次数怎么实现

通过微号帮平台工具提供的模板消息群发功能实现&#xff0c;可以不消耗公众号(服务号)每月4次群发次数发布消息&#xff0c;可以给所有粉丝或分组粉丝群发模板信息&#xff0c;模板信息没有图文形式、不支持插入封面图片&#xff0c;模板信息为固定格式的文本模块消息;模板信息…

微信公众号测试号配置,群发消息(go实现)

配置服务器&#xff08;以本地服务器127.0.0.1:8080为例&#xff09; ⑴新建项目&#xff08;这里用的goframe框架&#xff09; 路由&#xff1a; var (Main gcmd.Command{Name: "main",Usage: "main",Brief: "start http server",Func: fu…

微信公众号测试账号申请,后台获取公众号关注取关事件,获取用户发送消息

目录 1、访问微信公众号平台2、扫码登录3、登录后进行接口信息配置4、完成以上配置和代码&#xff0c;将代码部署到服务器上&#xff0c;后台就可以接收到公众号的关注、取关、用户发送的消息等等事件拉&#xff01; 1、访问微信公众号平台 微信公众号测试地址 2、扫码登录 …