热门标签 | 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



推荐阅读
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文详细介绍了如何在 Vue CLI 3.0 和 2.0 中配置 proxy 来解决开发环境下的跨域问题,包括具体的配置项和使用场景。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • 提升工作效率:掌握15个键盘快捷键
    在日常工作中,熟练掌握计算机操作技巧能够显著提升工作效率。本文将介绍15个常用的键盘快捷键,帮助用户更加高效地完成工作任务。 ... [详细]
  • 本文详细记录了腾讯ABS云平台的一次前端开发岗位面试经历,包括面试过程中遇到的JavaScript相关问题、Vue.js等框架的深入探讨以及算法挑战等内容。 ... [详细]
  • 本文是对《敏捷软件开发:原则、模式与实践》一书的深度解析,书中不仅探讨了敏捷方法的核心理念及其应用,还详细介绍了面向对象设计的原则、设计模式的应用技巧及UML的有效使用。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本篇文章详细探讨了微机原理实验中的指令系统,特别是第三章的内容。对于希望深入了解微机工作原理和技术实现的朋友来说,这是一篇不可多得的技术指南。文章不仅涵盖了基础概念,还深入讲解了指令格式、操作数类型以及各种寻址方式,旨在帮助读者更好地掌握微机指令系统的应用。 ... [详细]
  • 原文地址:https:blog.csdn.netqq_35361471articledetails84715491原文地址:https:blog.cs ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 使用 Vue3 Script Setup 语法糖构建双人联机俄罗斯方块
    作为一名前端开发者,Vue3 是一个不可或缺的工具。本文通过一个实战项目——双人联机俄罗斯方块,详细介绍如何利用 Vue3 的 Script Setup 语法糖进行开发,帮助读者掌握最新的前端技术。 ... [详细]
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社区 版权所有