idea快速生成crud
如今,REST API已成为Web应用程序开发标准,可以将Web开发分为两个单独的部分。 UI使用了几种主流框架,例如Angular,React,Vue。 后端开发人员可以从多种语言和框架中自由选择。 今天,我想讨论NestJS框架。 我们将使用Nest和@ nestjsx / crud包创建一个简单的CRUD应用程序。
最近,Javascript社区中出现了许多后端框架。 它们都提供与Nest相同的功能,但是Nest体系结构使其在其他软件中脱颖而出。 下列NestJS功能可让您创建可用于生产环境的应用程序,并为大型团队扩展开发规模:
该框架的灵感来自Angular (前端框架),从概念上讲它们有很多共同点。
@ 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
现在,让我们看看我们需要每个包装的用途:
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个容器:
为了与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,密码—例如。 其余的配置非常琐碎,因此让我们仅考虑最重要的参数。
synchronize
。 它指定启动应用程序时是否应自动创建数据库模式。 请注意,如果在生产中使用此参数,将会丢失一些数据。 但是,此参数对于调试和开发很有用。 您可以改为从TypeORM CLI运行schema:sync命令。 dropSchema
。 建立连接后,它将删除架构。 与上一个参数一样,此参数只能用于调试和开发。 entities
。 它指定在哪里可以找到模型描述。 请注意,此处支持掩码搜索。 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。 其他命令只是您作为开发人员每天都会使用的有用的约定:
“migration:generate”
-根据模型的更改生成迁移。 “migration:create”
—创建一个空的迁移文件。 “migration:run”
—运行迁移。 终于可以了! 我们已经添加了所有必需的软件包,将应用程序配置为通过CLI和应用程序本身与数据库交互,并启动了数据库管理系统。 现在是时候向我们的应用程序添加一些逻辑了。
您可以设计一个API,以仅使用Nest来创建,读取,更新和删除实体。 这种方法是最灵活的一种,但在某些情况下可能会过分。 例如,如果您需要快速创建原型,则可以牺牲灵活性以提高开发速度。 许多框架允许您从实体数据模型描述生成CRUD API。 Nest也不例外。 @ nestjsx / crud包使事情发生。 它的功能非常令人兴奋:
它由几个软件包组成:
对于我们的应用程序,我们需要@ nestjsx / crud和@ nestjsx / crud-typeorm软件包。 让我们安装它们:
yarnadd @nestjsx/crud class -transformer class - validator
声明类模型实例转换规则和传入请求验证分别需要class-transformer和class-validator包。 这些软件包是由同一作者创建的,因此具有类似的实现。
让我们以用户列表作为模型。 用户具有以下字段: id
, username
, displayName
, email
。 Id
是一个自动递增字段, email
和username
-唯一字段。 就那么简单! 现在,让我们以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
如您所见,不仅会自动生成运行,而且还会自动生成回滚方法。 难以置信!
现在,我们只需要运行此迁移。 使用以下命令:
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
}
我们将在用户控制器中需要此服务。 要创建控制器,请在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
}
就这样! 控制器现在支持模型的全部操作。 不可能是真的 让我们来看看我们的应用程序!
为了测试我们的服务,我们将使用TestMace — API设计的IDE。 为什么选择TestMace? 与同类产品相比,它具有一些优势:
让我们运行npm start
命令启动服务器并访问用户列表。 根据控制器配置,可以在localhost:3000/users
找到该列表。 让我们向这个网址发送请求。
运行TestMace后,您可以看到以下界面:
在屏幕的左上方,有一个项目树,其中“ 项目”是一个根节点。 让我们创建第一个请求以获取用户列表。 右键单击Project节点,然后选择Add node- > RequestStep 。
在URL字段中插入localhost:3000/users
并发送请求。 您将在响应正文中获得一个200码和一个空数组。 这很有意义,我们尚未添加任何内容。
让我们用以下步骤创建一个方案:
我们走吧。 为方便起见,创建一个Folder节点 。 实际上,这只是一个用于存储整个方案的文件夹。 要创建Folder节点,请在Project节点上单击鼠标右键,然后选择Add node-> Folder 。 将其命名为check-create 。 在此节点内添加您的第一个请求以创建用户。 将新节点命名为create-user 。 目前,我们具有以下节点层次结构:
现在转到“ 创建用户节点”选项卡。 输入以下请求参数:
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节点中创建删除用户请求:
localhost:3000/users/${$dynamicVar.userId}
。 运行。 等待。 请享用 :)
现在,您可以随时运行完整方案。 为此,只需右键单击检查创建节点,然后选择运行 。
节点将因此运行。
您可以通过File-> Save project来保存此方案以在您自己的项目中使用。
我没有介绍本文中使用的工具的所有可能功能。 至于@ nestjsx / crud包(本文的主要主题),以下功能值得讨论:
但是,本文中提供的信息足以使您意识到,即使像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