热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

idea快速生成crud_使用NestJS,@nestjsx/crud和TestMace进行快速轻松的CRUD

idea快速生成crud如今,RESTAPI已成为Web应用程序开发标准,可以将Web开发分为两个单独的部分。UI使用了几种主流框架,例如

idea快速生成crud

如今,REST API已成为Web应用程序开发标准,可以将Web开发分为两个单独的部分。 UI使用了几种主流框架,例如Angular,React,Vue。 后端开发人员可以从多种语言和框架中自由选择。 今天,我想讨论NestJS框架。 我们将使用Nest和@ nestjsx / crud包创建一个简单的CRUD应用程序。

为什么选择NestJS

最近,Javascript社区中出现了许多后端框架。 它们都提供与Nest相同的功能,但是Nest体系结构使其在其他软件中脱颖而出。 下列NestJS功能可让您创建可用于生产环境的应用程序,并为大型团队扩展开发规模:

  1. TypeScript作为主要的编程语言。 尽管NestJS支持Javascript,但它可能无法正常工作,尤其是在第三方程序包中。
  2. DI容器,允许创建松耦合的组件;
  3. 框架功能分为独立的可互换组件。 例如,既快速和fastify可以用作发动机罩下的框架,以及用于数据库巢提供typeorm , 猫鼬 , sequelize绑定开箱;
  4. NestJS独立于平台,并支持REST,GraphQL,Websockets,gRPC等。

该框架的灵感来自Angular (前端框架),从概念上讲它们有很多共同点。

NestJS安装和项目部署

@ nest / cli是一个Nest软件包,可用于快速部署基本的应用程序框架。 全局安装此软件包:

npm install -- global @nest/cli

之后,生成运行命令nest new nest-rest名为nest-rest的应用程序框架。

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects $ nest new nest-rest
⚡ We will scaffold your appin a few seconds..
CREATE /nest-rest/.prettierrc (51 bytes)
CREATE /nest-rest/README.md (3370 bytes)
CREATE /nest-rest/nest-cli.json (84 bytes)
CREATE /nest-rest/nodemon-debug.json (163 bytes)
CREATE /nest-rest/nodemon.json (67 bytes)
CREATE /nest-rest/package.json (1805 bytes)
CREATE /nest-rest/tsconfig.build.json (97 bytes)
CREATE /nest-rest/tsconfig.json (325 bytes)
CREATE /nest-rest/tslint.json (426 bytes)
CREATE /nest-rest/src/app.controller.spec.ts (617 bytes)
CREATE /nest-rest/src/app.controller.ts (274 bytes)
CREATE /nest-rest/src/app.module.ts (249 bytes)
CREATE /nest-rest/src/app.service.ts (142 bytes)
CREATE /nest-rest/src/main.ts (208 bytes)
CREATE /nest-rest/ test /app.e2e-spec.ts (561 bytes)
CREATE /nest-rest/ test /jest-e2e.json (183 bytes)
? Which package manager would you ❤️ to use? yarn
✔ Installation in progress... ☕
🚀 Successfully created project nest-rest
👉 Get started with the following commands:
$ cd nest-rest
$ yarn run start
Thanks for installing Nest 🙏Please consider donating to our open collectiveto help us maintain this package.🍷 Donate: https://opencollective.com/nest

选择yarn作为程序包管理器。

现在,您可以运行npm start命令来启动服务器。 按照链接http:// localhost:3000查看主页。 很好,但这不是我们想要的。

设置数据库

考虑到该项目的数据库管理系统,我决定使用PostrgreSQL。 口味各不相同,我相信这是最成熟的数据库管理系统,具有您可能需要的所有可能功能。 正如我已经提到的,Nest提供了与不同软件包的集成以使用数据库。 由于选择了PostgreSQL,因此选择TypeORM作为ORM是合乎逻辑的。 因此,让我们安装所有必需的软件包以进行数据库集成:

yarn add typeorm @ nestjs / typeorm pg

现在,让我们看看我们需要每个包装的用途:

  1. typeorm — ORM附带;
  2. @ nestjs / typeorm — NestJS的TypeORM包。 它添加了辅助装饰器和模块,可随时导入到项目模块中;
  3. pg — PostgreSQL驱动程序。
  4. version: '3.1'
    services:
    db:
    image: postgres:11.2
    restart: always
    environment:
    POSTGRES_PASSWORD: example
    volumes:- ../db:/var/lib/postgresql/data- ./postgresql.conf:/etc/postgresql/postgresql.conf
    ports:- 5432 :5432
    adminer:
    image: adminer
    restart: always
    ports:- 8080 :8080

    如您所见,此文件配置运行2个容器:

    1. db —包含数据库的容器。 我们正在使用PostgreSQL版本11.2;
    2. 管理员-数据库管理员。 它提供了一个Web界面来查看和管理数据库。

    为了与TCP连接进行交互,我添加了以下config 。

    就是这样,现在您可以使用docker-compose up -d命令或docker-compose up命令运行容器,以在单独的控制台窗口中运行它们。 通过这种方式查看日志更为简单。

    好了,安装软件包,运行数据库,现在我们必须将它们放在一起。 为此,将ormconfig.js文件添加到项目根目录:

    const process = require ( 'process' );
    const username = process.env.POSTGRES_USER || "postgres" ;
    const password = process.env.POSTGRES_PASSWORD || "example" ;
    module .exports = {"type" : "postgres" ,"host" : "localhost" ,"port" : 5432 ,username,password,"database" : "postgres" ,"synchronize" : true ,"dropSchema" : false ,"logging" : true ,"entities" : [__dirname + "/src/**/*.entity.ts" , __dirname + "/dist/**/*.entity.js" ],"migrations" : [ "migrations/**/*.ts" ],"subscribers" : [ "subscriber/**/*.ts" , "dist/subscriber/**/.js" ],"cli" : {"entitiesDir" : "src" ,"migrationsDir" : "migrations" ,"subscribersDir" : "subscriber"}
    }

    此配置将用于TypeORM CLI。

    让我们再仔细看看。 在第3行和第4行中,我们从环境变量中获取用户名和密码。 当您有多个环境(开发,阶段,产品等)时,这非常方便。 默认的用户名是postgres,密码—例如。 其余的配置非常琐碎,因此让我们仅考虑最重要的参数。

    1. synchronize 。 它指定启动应用程序时是否应自动创建数据库模式。 请注意,如果在生产中使用此参数,将会丢失一些数据。 但是,此参数对于调试和开发很有用。 您可以改为从TypeORM CLI运行schema:sync命令。
    2. dropSchema 。 建立连接后,它将删除架构。 与上一个参数一样,此参数只能用于调试和开发。
    3. entities 。 它指定在哪里可以找到模型描述。 请注意,此处支持掩码搜索。
    4. cli.entitiesDir 这是默认情况下存储从TypeORM CLI创建的模型的目录。

    为了充分利用Nest应用程序中的TypeORM功能,我们需要将TypeOrmModule导入AppModule 。 您的AppModule将如下所示:

    import { Module } from '@nestjs/common' ;
    import { AppController } from './app.controller' ;
    import { AppService } from './app.service' ;
    import { TypeOrmModule } from '@nestjs/typeorm' ;
    import * as process from "process" ;
    const username = process.env.POSTGRES_USER || 'postgres' ;
    const password = process.env.POSTGRES_PASSWORD || 'example' ;
    @Module ({imports: [TypeOrmModule.forRoot({type : 'postgres' ,host: 'localhost' ,port: 5432 ,username,password,database: 'postgres' ,entities: [__dirname + '/**/*.entity{.ts,.js}' ],synchronize: true ,}),],controllers: [AppController],providers: [AppService],
    })
    export class AppModule {}

    如您所见,我们将与ormconfig.ts文件中相同的数据库配置传递给forRoot方法。

    我们还有另一件事要做-将一些任务添加到package.json中以使用TypeORM。 事实是CLI是用Javascript编写的,因此可以在NodeJS中运行,但是我们所有的模型和迁移都是用Typescript编写的。 因此,在使用CLI之前,我们需要先对它们进行转换。 为此,我们需要在全局安装ts-node软件包:

    npm install -g ts-node

    将以下命令添加到package.json:

    "typeorm" : "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js" ,
    "migration:generate" : "yarn run typeorm migration:generate -n" ,
    "migration:create" : "yarn run typeorm migration:create -n" ,
    "migration:run" : "yarn run typeorm migration:run"

    第一个命令是typeorm,它添加ts-node作为包装以运行TypeORM CLI。 其他命令只是您作为开发人员每天都会使用的有用的约定:

    1. “migration:generate” -根据模型的更改生成迁移。
    2. “migration:create” —创建一个空的迁移文件。
    3. “migration:run” —运行迁移。

    终于可以了! 我们已经添加了所有必需的软件包,将应用程序配置为通过CLI和应用程序本身与数据库交互,并启动了数据库管理系统。 现在是时候向我们的应用程序添加一些逻辑了。

    安装CRUD软件包

    您可以设计一个API,以仅使用Nest来创建,读取,更新和删除实体。 这种方法是最灵活的一种,但在某些情况下可能会过分。 例如,如果您需要快速创建原型,则可以牺牲灵活性以提高开发速度。 许多框架允许您从实体数据模型描述生成CRUD API。 Nest也不例外。 @ nestjsx / crud包使事情发生。 它的功能非常令人兴奋:

  • DBMS独立性;
  • 易于安装和设置;
  • 强大的查询语言,具有过滤,分页,排序,关系,嵌套关系,缓存等;
  • 一个带有查询生成器的前端使用包;
  • 简单的控制器方法覆盖;
  • 小配置
  • 全面的文档支持。

它由几个软件包组成:

  • @ nestjsx / crud —核心程序包,它提供@Crud()装饰器用于端点的生成,配置和验证;
  • @ nestjsx / crud-request —请求生成器/解析器包用于前端使用;
  • @ nestjsx / crud-typeorm — TypeORM软件包,它为基本TypeOrmCrudService提供CRUD数据库操作的方法。

对于我们的应用程序,我们需要@ nestjsx / crud和@ nestjsx / crud-typeorm软件包。 让我们安装它们:

yarnadd @nestjsx/crud class -transformer class - validator

声明类模型实例转换规则和传入请求验证分别需要class-transformer和class-validator包。 这些软件包是由同一作者创建的,因此具有类似的实现。

CRUD实施

让我们以用户列表作为模型。 用户具有以下字段: id , username , displayName , emailId是一个自动递增字段, emailusername -唯一字段。 就那么简单! 现在,让我们以Nest应用程序的形式将创意变为现实。

首先,让我们创建一个用户模块,该模块将负责与用户合作。 在项目根目录的NestJS CLI中运行nest g module users命令。

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects/nest-rest git:(master*)$ nest g module users
CREATE /src/users/users.module.ts (82 bytes)
UPDATE /src/app.module.ts (312 bytes)

添加实体文件夹,您将在其中存储此模块模型。 在此处添加带有用户模型描述的user.entity.ts文件:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm' ;
@Entity ()
export class User {@PrimaryGeneratedColumn ()id: string ;@Column ({unique: true })email: string ;@Column ({unique: true })username: string ;@Column ({nullable: true })displayName: string ;
}

对于我们的应用程序找到这种模式,我们需要进口TypeOrmModule与以下内容为UsersModule :

import { Module } from '@nestjs/common' ;
import { UsersController } from './controllers/users/users.controller' ;
import { UsersService } from './services/users/users.service' ;
import { TypeOrmModule } from '@nestjs/typeorm' ;
import { User } from './entities/user.entity' ;
@Module ({controllers: [UsersController],providers: [UsersService],imports: [TypeOrmModule.forFeature([User])]
})
export class UsersModule {}

我们导入TypeOrmModule并将此模块模型列表作为forFeature参数传递。

现在我们需要创建一个相应的数据库实体。 这就是我们需要的迁移机制。 要基于模型更改创建迁移,请运行以下命令:

$ npm run migration:generate -- CreateUserTable
Migration /home/dmitrii/projects/nest-rest/migrations/1563346135367-CreateUserTable.ts has been generated successfully.
Donein 1.96s.

看,您不必手动编写迁移,它是自动创建的。 这是魔法! 但这仅仅是一个开始。 让我们看一下我们的迁移文件:

import {MigrationInterface, QueryRunner} from "typeorm" ;export class CreateUserTable1563346816726 implements MigrationInterface {public async up(queryRunner: QueryRunner): Promise {await queryRunner.query( `CREATE TABLE "user" ("id" SERIAL NOT NULL, "email" character varying NOT NULL, "username" character varying NOT NULL, "displayName" character varying, CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "UQ_78a916df40e02a9deb1c4b75edb" UNIQUE ("username"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))` );}public async down(queryRunner: QueryRunner): Promise {await queryRunner.query( `DROP TABLE "user"` );}}

如您所见,不仅会自动生成运行,而且还会自动生成回滚方法。 难以置信!

现在,我们只需要运行此迁移。 使用以下命令:

npmrun migration: run .

模式更改刚刚被传输到数据库。

现在,让我们创建一个服务于用户的服务,并从TypeOrmCrudService继承它。 我们需要将相关的实体存储库(在我们的例子中是用户存储库)传递给父构造函数参数。

import { Injectable } from '@nestjs/common' ;
import { TypeOrmCrudService } from '@nestjsx/crud-typeorm' ;
import { User } from '../../entities/user.entity' ;
import { InjectRepository } from '@nestjs/typeorm' ;
import { Repository } from 'typeorm' ;
@Injectable ()
export class UsersService extends TypeOrmCrudService{constructor ( @InjectRepository (User) usersRepository: Repository ){super (usersRepository);}
}

我们将在用户控制器中需要此服务。 要创建控制器,请在CLI中运行nest g controller users/controllers/users命令。

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects/nest-rest git:(master*)$ nest g controller users/controllers/users
CREATE /src/users/controllers/users/users.controller.spec.ts (486 bytes)
CREATE /src/users/controllers/users/users.controller.ts (99 bytes)
UPDATE /src/users/users.module.ts (188 bytes)

打开控制器,并向其中添加一些@ nestjsx / crud魔术。 为UsersController类添加以下装饰器:

@Crud ({model: {type : User}
})

@Crud装饰器向控制器添加了一些有用的方法来处理模型。 在装饰器配置的model.type字段中指定模型类型。

下一步是实现CrudController接口。 控制器的整个代码如下所示:

import { Controller } from '@nestjs/common' ;
import { Crud, CrudController } from '@nestjsx/crud' ;
import { User } from '../../entities/user.entity' ;
import { UsersService } from '../../services/users/users.service' ;
@Crud ({model: {type : User}
})
@Controller ( 'users' )
export class UsersController implements CrudController{constructor ( public service: UsersService ){}
}

就这样! 控制器现在支持模型的全部操作。 不可能是真的 让我们来看看我们的应用程序!

在TestMace中创建请求方案

为了测试我们的服务,我们将使用TestMace — API设计的IDE。 为什么选择TestMace? 与同类产品相比,它具有一些优势:

  • 强大的变量机制。 有几种变量类型,每种类型都有其自己的用途:默认变量,动态变量,环境变量。 每个变量都属于一个特定的节点,支持继承;
  • 创建方案而无需编程。 我们待会儿再讨论。
  • 一种人类可读的格式,可以将您的项目存储在版本控制系统中;
  • 自动完成功能,语法突出显示,变量值突出显示;
  • API描述支持+从Swagger导入。

让我们运行npm start命令启动服务器并访问用户列表。 根据控制器配置,可以在localhost:3000/users找到该列表。 让我们向这个网址发送请求。
运行TestMace后,您可以看到以下界面:

在屏幕的左上方,有一个项目树,其中“ 项目”是一个根节点。 让我们创建第一个请求以获取用户列表。 右键单击Project节点,然后选择Add node- > RequestStep

在URL字段中插入localhost:3000/users并发送请求。 您将在响应正文中获得一个200码和一个空数组。 这很有意义,我们尚未添加任何内容。

让我们用以下步骤创建一个方案:

  1. 创建一个用户;
  2. 通过其ID请求用户;
  3. 通过其ID删除用户。

我们走吧。 为方便起见,创建一个Folder节点 。 实际上,这只是一个用于存储整个方案的文件夹。 要创建Folder节点,请在Project节点上单击鼠标右键,然后选择Add node-> Folder 。 将其命名为check-create 。 在此节点内添加您的第一个请求以创建用户。 将新节点命名为create-user 。 目前,我们具有以下节点层次结构:

现在转到“ 创建用户节点”选项卡。 输入以下请求参数:

  • 请求类型-POST ;
  • URL — localhost:3000/users ;
  • {“email": “user@user.com", “displayName": “New user", “username": “user"} — JSON,值为{“email": “user@user.com", “displayName": “New user", “username": “user"}

发送请求。 该应用程序告诉我们记录已创建。

让我们检查一下。 我们需要保存所添加用户的ID,以便以后使用。 这就是我们的动态变量机制可以为我们提供的帮助。 让我们使用前面的示例看看它是如何工作的。 右键单击id节点,然后在“解析”选项卡上选择“ 分配给变量” 。 在对话框窗口中设置参数:

  • 节点指定变量的父节点。 选择检查创建 ;
  • 变量名。 我们将其命名为userId

这就是创建动态变量的样子:

完成后,每次您发送此请求时,动态变量值都会更新。 由于动态变量支持分层继承,因此userId变量将在任何嵌套级别的check-create节点子代中始终可用。

在下一个请求中,我们将需要此变量。 让我们获取新添加的用户。 使用localhost:3000/users/${$dynamicVar.userId}作为url参数,将check-if-exists请求创建check-create节点的子项。 ${variable_name}构造用于获取变量值。 由于有了动态变量,因此必须访问$ dynamicVar ,因此构造将如下所示: ${dynamicVar.userId} 。 发送请求,并确保它能够满足要求。

最后要做的是删除用户。 由于电子邮件和用户名字段是唯一的,因此我们不仅需要发送最终请求以检查其是否正常运行,而且还需要清理数据库。 使用以下参数在check-create节点中创建删除用户请求:

  1. 请求类型-DELETE ;
  2. URL — localhost:3000/users/${$dynamicVar.userId}

运行。 等待。 请享用 :)

现在,您可以随时运行完整方案。 为此,只需右键单击检查创建节点,然后选择运行

节点将因此运行。

您可以通过File-> Save project来保存此方案以在您自己的项目中使用。

结论

我没有介绍本文中使用的工具的所有可能功能。 至于@ nestjsx / crud包(本文的主要主题),以下功能值得讨论:

  1. 定制模型验证和转换;
  2. 强大的查询语言及其便捷的前端用法;
  3. 在Crud控制器中添加和覆盖方法;
  4. 大力支持
  5. 缓存管理。

但是,本文中提供的信息足以使您意识到,即使像NestJS这样的企业框架也具有快速构建应用程序原型的全部能力。 而且我们出色的TestMace IDE有助于跟上步伐。

您可以在存储库中找到源代码和本文的文本: https : //github.com/TestMace/nest-rest 。 选择“ 文件”->“打开项目”以在应用程序中打开一个TestMace项目。

翻译自: https://hackernoon.com/quick-and-easy-crud-with-nestjs-nestjsxcrud-and-testmace-t9cn313h

idea快速生成crud



推荐阅读
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 在多线程环境中,IpcChannel的性能表现并未如预期般优于Tcp和Http通道。实际测试结果显示,在IIS6中通过Remoting创建的Ipc通道,其速度比Tcp通道慢了约20倍。本文详细分析了这一现象的原因,并提出了针对性的优化建议,以提升IpcChannel在高并发场景下的性能表现。 ... [详细]
  • 深入解析Android GPS机制:第五部分 ... [详细]
author-avatar
cy45vsf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有