Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Eins og er er REST API orðið staðall fyrir þróun vefforrita, sem gerir kleift að skipta þróun í sjálfstæða hluta. Ýmsir vinsælir rammar eins og Angular, React, Vue og aðrir eru nú notaðir fyrir HÍ. Bakendahönnuðir geta valið úr fjölmörgum tungumálum og ramma. Í dag langar mig að tala um slíkan ramma eins og NestJS. Við erum í TestMace Við notum það virkan fyrir innri verkefni. Notar hreiður og pakka @nestjsx/crud, munum við búa til einfalt CRUD forrit.

Hvers vegna NestJS

Nýlega hefur töluvert mikið af bakenda ramma birst í JavaScript samfélaginu. Og ef hvað varðar virkni þeir veita svipaða getu og Nest, þá vinnur það örugglega í einu - þetta er arkitektúrinn. Eftirfarandi NestJS eiginleikar gera þér kleift að búa til iðnaðarforrit og stækka þróun fyrir stór teymi:

  • nota TypeScript sem aðal þróunarmál. Þó NestJS styðji JavaScript getur verið að sum virkni virki ekki, sérstaklega ef við erum að tala um þriðja aðila pakka;
  • tilvist DI íláts, sem gerir þér kleift að búa til lauslega tengda íhluti;
  • Virkni rammans sjálfs er skipt í sjálfstæða skiptanlega þætti. Til dæmis, undir hettunni sem umgjörð er hægt að nota það sem ExpressOg fastast, til að vinna með gagnagrunninn, hreiður út úr kassanum veitir bindingar til tegundarform, Mongósa, framhald;
  • NestJS er vettvangslaus og styður REST, GraphQL, Websockets, gRPC osfrv.

Ramminn sjálfur er innblásinn af Angular framenda rammanum og á hugmyndalega margt sameiginlegt með honum.

Uppsetning NestJS og innleiðing verkefnisins

Nest inniheldur pakka hreiður/cli, sem gerir þér kleift að dreifa á fljótlegan hátt grunnforritsramma. Við skulum setja þennan pakka upp á heimsvísu:

npm install --global @nest/cli

Eftir uppsetningu munum við búa til grunnramma forritsins okkar með nafninu nest-rest. Þetta er gert með því að nota skipunina nest new nest-rest.

hreiður ný hreiður-hvíld

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects $ nest new nest-rest
  We will scaffold your app in 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 collective
                        to help us maintain this package.

                 Donate: https://opencollective.com/nest

Við munum velja garn sem pakkastjóra.
Á þessum tímapunkti geturðu ræst þjóninn með skipuninni npm start og fer á heimilisfangið http://localhost:3000 þú getur séð aðalsíðuna. Hins vegar er þetta ekki ástæðan fyrir því að við höfum safnast saman hér og við höldum áfram.

Uppsetning vinnu með gagnagrunninn

Ég valdi PostrgreSQL sem DBMS fyrir þessa grein. Það er enginn ágreiningur um smekk; að mínu mati er þetta þroskaðasta DBMS, sem hefur alla nauðsynlega getu. Eins og áður hefur komið fram veitir Nest samþættingu við ýmsa pakka til að vinna með gagnagrunna. Vegna þess að Þar sem val mitt féll á PostgreSQL væri rökrétt að velja TypeORM sem ORM. Við skulum setja upp nauðsynlega pakka fyrir samþættingu við gagnagrunninn:

yarn add typeorm @nestjs/typeorm pg

Í röð, hvað þarf hver pakki fyrir:

  1. typeorm - pakki beint frá ORM sjálfum;
  2. @nestjs/typeorm - TypeORM pakki fyrir NestJS. Bætir við einingum til að flytja inn í verkeiningar, svo og setti af hjálparskreytendum;
  3. pg - bílstjóri fyrir að vinna með PostgreSQL.

Allt í lagi, pakkarnir eru settir upp, nú þarftu að ræsa gagnagrunninn sjálfan. Til að dreifa gagnagrunninum mun ég nota docker-compose.yml með eftirfarandi efni:

Docker-compose.yml

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

Eins og þú sérð stillir þessi skrá ræsingu 2 gáma:

  1. db er gámur sem inniheldur gagnagrunninn beint. Í okkar tilviki er postgresql útgáfa 11.2 notuð;
  2. adminer—gagnagrunnsstjóri. Býður upp á vefviðmót til að skoða og stjórna gagnagrunninum.

Til að vinna með tcp tengingar bætti ég við eftirfarandi stillingum.

postgresql.conf

# -----------------------------
# PostgreSQL configuration file
# -----------------------------
#
# This file consists of lines of the form:
#
#   name = value
#
# (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
# "#" anywhere on a line.  The complete list of parameter names and allowed
# values can be found in the PostgreSQL documentation.
#
# The commented-out settings shown in this file represent the default values.
# Re-commenting a setting is NOT sufficient to revert it to the default value;
# you need to reload the server.
#
# This file is read on server startup and when the server receives a SIGHUP
# signal.  If you edit the file on a running system, you have to SIGHUP the
# server for the changes to take effect, run "pg_ctl reload", or execute
# "SELECT pg_reload_conf()".  Some parameters, which are marked below,
# require a server shutdown and restart to take effect.
#
# Any parameter can also be given as a command-line option to the server, e.g.,
# "postgres -c log_connections=on".  Some parameters can be changed at run time
# with the "SET" SQL command.
#
# Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
#                MB = megabytes                     s   = seconds
#                GB = gigabytes                     min = minutes
#                TB = terabytes                     h   = hours
#                                                   d   = days
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.
#data_directory = 'ConfigDir'       # use data in another directory
# (change requires restart)
#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
# (change requires restart)
#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
# (change requires restart)
# If external_pid_file is not explicitly set, no extra PID file is written.
#external_pid_file = ''         # write an extra PID file
# (change requires restart)
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'
#listen_addresses = 'localhost'     # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
#port = 5432                # (change requires restart)
#max_connections = 100          # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directories = '/tmp'   # comma-separated list of directories
# (change requires restart)
#unix_socket_group = ''         # (change requires restart)
#unix_socket_permissions = 0777     # begin with 0 to use octal notation
# (change requires restart)
#bonjour = off              # advertise server via Bonjour
# (change requires restart)
#bonjour_name = ''          # defaults to the computer name
# (change requires restart)
# - TCP Keepalives -
# see "man 7 tcp" for details
#tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
# 0 selects the system default
#tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
# 0 selects the system default
#tcp_keepalives_count = 0       # TCP_KEEPCNT;
# 0 selects the system default
# - Authentication -
#authentication_timeout = 1min      # 1s-600s
#password_encryption = md5      # md5 or scram-sha-256
#db_user_namespace = off
# GSSAPI using Kerberos
#krb_server_keyfile = ''
#krb_caseins_users = off
# - SSL -
#ssl = off
#ssl_ca_file = ''
#ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
# - Memory -
#shared_buffers = 32MB          # min 128kB
# (change requires restart)
#huge_pages = try           # on, off, or try
# (change requires restart)
#temp_buffers = 8MB         # min 800kB
#max_prepared_transactions = 0      # zero disables the feature
# (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
#work_mem = 4MB             # min 64kB
#maintenance_work_mem = 64MB        # min 1MB
#autovacuum_work_mem = -1       # min 1MB, or -1 to use maintenance_work_mem
#max_stack_depth = 2MB          # min 100kB
#shared_memory_type = mmap      # the default is the first option
# supported by the operating system:
#   mmap
#   sysv
#   windows
# (change requires restart)
#dynamic_shared_memory_type = posix # the default is the first option
# supported by the operating system:
#   posix
#   sysv
#   windows
#   mmap
# (change requires restart)
# - Disk -
#temp_file_limit = -1           # limits per-process temp file space
# in kB, or -1 for no limit
# - Kernel Resources -
#max_files_per_process = 1000       # min 25
# (change requires restart)
# - Cost-Based Vacuum Delay -
#vacuum_cost_delay = 0          # 0-100 milliseconds (0 disables)
#vacuum_cost_page_hit = 1       # 0-10000 credits
#vacuum_cost_page_miss = 10     # 0-10000 credits
#vacuum_cost_page_dirty = 20        # 0-10000 credits
#vacuum_cost_limit = 200        # 1-10000 credits
# - Background Writer -
#bgwriter_delay = 200ms         # 10-10000ms between rounds
#bgwriter_lru_maxpages = 100        # max buffers written/round, 0 disables
#bgwriter_lru_multiplier = 2.0      # 0-10.0 multiplier on buffers scanned/round
#bgwriter_flush_after = 0       # measured in pages, 0 disables
# - Asynchronous Behavior -
#effective_io_concurrency = 1       # 1-1000; 0 disables prefetching
#max_worker_processes = 8       # (change requires restart)
#max_parallel_maintenance_workers = 2   # taken from max_parallel_workers
#max_parallel_workers_per_gather = 2    # taken from max_parallel_workers
#parallel_leader_participation = on
#max_parallel_workers = 8       # maximum number of max_worker_processes that
# can be used in parallel operations
#old_snapshot_threshold = -1        # 1min-60d; -1 disables; 0 is immediate
# (change requires restart)
#backend_flush_after = 0        # measured in pages, 0 disables
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
#wal_level = replica            # minimal, replica, or logical
# (change requires restart)
#fsync = on             # flush data to disk for crash safety
# (turning this off can cause
# unrecoverable data corruption)
#synchronous_commit = on        # synchronization level;
# off, local, remote_write, remote_apply, or on
#wal_sync_method = fsync        # the default is the first option
# supported by the operating system:
#   open_datasync
#   fdatasync (default on Linux)
#   fsync
#   fsync_writethrough
#   open_sync
#full_page_writes = on          # recover from partial page writes
#wal_compression = off          # enable compression of full-page writes
#wal_log_hints = off            # also do full page writes of non-critical updates
# (change requires restart)
#wal_buffers = -1           # min 32kB, -1 sets based on shared_buffers
# (change requires restart)
#wal_writer_delay = 200ms       # 1-10000 milliseconds
#wal_writer_flush_after = 1MB       # measured in pages, 0 disables
#commit_delay = 0           # range 0-100000, in microseconds
#commit_siblings = 5            # range 1-1000
# - Checkpoints -
#checkpoint_timeout = 5min      # range 30s-1d
#max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_flush_after = 0     # measured in pages, 0 disables
#checkpoint_warning = 30s       # 0 disables
# - Archiving -
#archive_mode = off     # enables archiving; off, on, or always
# (change requires restart)
#archive_command = ''       # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
#               %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0        # force a logfile segment switch after this
# number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
#restore_command = ''       # command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
#               %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
#archive_cleanup_command = ''   # command to execute at every restartpoint
#recovery_end_command = ''  # command to execute at completion of recovery
# - Recovery Target -
# Set these only when performing a targeted recovery.
#recovery_target = ''       # 'immediate' to end recovery as soon as a
# consistent state is reached
# (change requires restart)
#recovery_target_name = ''  # the named restore point to which recovery will proceed
# (change requires restart)
#recovery_target_time = ''  # the time stamp up to which recovery will proceed
# (change requires restart)
#recovery_target_xid = ''   # the transaction ID up to which recovery will proceed
# (change requires restart)
#recovery_target_lsn = ''   # the WAL LSN up to which recovery will proceed
# (change requires restart)
#recovery_target_inclusive = on # Specifies whether to stop:
# just after the specified recovery target (on)
# just before the recovery target (off)
# (change requires restart)
#recovery_target_timeline = 'latest'    # 'current', 'latest', or timeline ID
# (change requires restart)
#recovery_target_action = 'pause'   # 'pause', 'promote', 'shutdown'
# (change requires restart)
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
# - Sending Servers -
# Set these on the master and on any standby that will send replication data.
#max_wal_senders = 10       # max number of walsender processes
# (change requires restart)
#wal_keep_segments = 0      # in logfile segments; 0 disables
#wal_sender_timeout = 60s   # in milliseconds; 0 disables
#max_replication_slots = 10 # max number of replication slots
# (change requires restart)
#track_commit_timestamp = off   # collect timestamp of transaction commit
# (change requires restart)
# - Master Server -
# These settings are ignored on a standby server.
#synchronous_standby_names = '' # standby servers that provide sync rep
# method to choose sync standbys, number of sync standbys,
# and comma-separated list of application_name
# from standby(s); '*' = all
#vacuum_defer_cleanup_age = 0   # number of xacts by which cleanup is delayed
# - Standby Servers -
# These settings are ignored on a master server.
#primary_conninfo = ''          # connection string to sending server
# (change requires restart)
#primary_slot_name = ''         # replication slot on sending server
# (change requires restart)
#promote_trigger_file = ''      # file name whose presence ends recovery
#hot_standby = on           # "off" disallows queries during recovery
# (change requires restart)
#max_standby_archive_delay = 30s    # max delay before canceling queries
# when reading WAL from archive;
# -1 allows indefinite delay
#max_standby_streaming_delay = 30s  # max delay before canceling queries
# when reading streaming WAL;
# -1 allows indefinite delay
#wal_receiver_status_interval = 10s # send replies at least this often
# 0 disables
#hot_standby_feedback = off     # send info from standby to prevent
# query conflicts
#wal_receiver_timeout = 60s     # time that receiver waits for
# communication from master
# in milliseconds; 0 disables
#wal_retrieve_retry_interval = 5s   # time to wait before retrying to
# retrieve WAL after a failed attempt
#recovery_min_apply_delay = 0       # minimum delay for applying changes during recovery
# - Subscribers -
# These settings are ignored on a publisher.
#max_logical_replication_workers = 4    # taken from max_worker_processes
# (change requires restart)
#max_sync_workers_per_subscription = 2  # taken from max_logical_replication_workers
#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------
# - Planner Method Configuration -
#enable_bitmapscan = on
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
#enable_indexonlyscan = on
#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_parallel_append = on
#enable_seqscan = on
#enable_sort = on
#enable_tidscan = on
#enable_partitionwise_join = off
#enable_partitionwise_aggregate = off
#enable_parallel_hash = on
#enable_partition_pruning = on
# - Planner Cost Constants -
#seq_page_cost = 1.0            # measured on an arbitrary scale
#random_page_cost = 4.0         # same scale as above
#cpu_tuple_cost = 0.01          # same scale as above
#cpu_index_tuple_cost = 0.005       # same scale as above
#cpu_operator_cost = 0.0025     # same scale as above
#parallel_tuple_cost = 0.1      # same scale as above
#parallel_setup_cost = 1000.0   # same scale as above
#jit_above_cost = 100000        # perform JIT compilation if available
# and query more expensive than this;
# -1 disables
#jit_inline_above_cost = 500000     # inline small functions if query is
# more expensive than this; -1 disables
#jit_optimize_above_cost = 500000   # use expensive JIT optimizations if
# query is more expensive than this;
# -1 disables
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
#effective_cache_size = 4GB
# - Genetic Query Optimizer -
#geqo = on
#geqo_threshold = 12
#geqo_effort = 5            # range 1-10
#geqo_pool_size = 0         # selects default based on effort
#geqo_generations = 0           # selects default based on effort
#geqo_selection_bias = 2.0      # range 1.5-2.0
#geqo_seed = 0.0            # range 0.0-1.0
# - Other Planner Options -
#default_statistics_target = 100    # range 1-10000
#constraint_exclusion = partition   # on, off, or partition
#cursor_tuple_fraction = 0.1        # range 0.0-1.0
#from_collapse_limit = 8
#join_collapse_limit = 8        # 1 disables collapsing of explicit
# JOIN clauses
#force_parallel_mode = off
#jit = on               # allow JIT compilation
#plan_cache_mode = auto         # auto, force_generic_plan or
# force_custom_plan
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
#log_destination = 'stderr'     # Valid values are combinations of
# stderr, csvlog, syslog, and eventlog,
# depending on platform.  csvlog
# requires logging_collector to be on.
# This is used when logging to stderr:
#logging_collector = off        # Enable capturing of stderr and csvlog
# into log files. Required to be on for
# csvlogs.
# (change requires restart)
# These are only used if logging_collector is on:
#log_directory = 'log'          # directory where log files are written,
# can be absolute or relative to PGDATA
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'    # log file name pattern,
# can include strftime() escapes
#log_file_mode = 0600           # creation mode for log files,
# begin with 0 to use octal notation
#log_truncate_on_rotation = off     # If on, an existing log file with the
# same name as the new log file will be
# truncated rather than appended to.
# But such truncation only occurs on
# time-driven rotation, not on restarts
# or size-driven rotation.  Default is
# off, meaning append to existing files
# in all cases.
#log_rotation_age = 1d          # Automatic rotation of logfiles will
# happen after that time.  0 disables.
#log_rotation_size = 10MB       # Automatic rotation of logfiles will
# happen after that much log output.
# 0 disables.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#syslog_sequence_numbers = on
#syslog_split_messages = on
# This is only relevant when logging to eventlog (win32):
# (change requires restart)
#event_source = 'PostgreSQL'
# - When to Log -
#log_min_messages = warning     # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic
#log_min_error_statement = error    # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic (effectively off)
#log_min_duration_statement = -1    # logs statements and their durations
# according to log_statement_sample_rate. -1 is disabled,
# 0 logs all statement, > 0 logs only statements running at
# least this number of milliseconds.
#log_statement_sample_rate = 1  # Fraction of logged statements over
# log_min_duration_statement. 1.0 logs all statements,
# 0 never logs.
# - What to Log -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_error_verbosity = default      # terse, default, or verbose messages
#log_hostname = off
#log_line_prefix = '%m [%p] '       # special values:
#   %a = application name
#   %u = user name
#   %d = database name
#   %r = remote host and port
#   %h = remote host
#   %p = process ID
#   %t = timestamp without milliseconds
#   %m = timestamp with milliseconds
#   %n = timestamp with milliseconds (as a Unix epoch)
#   %i = command tag
#   %e = SQL state
#   %c = session ID
#   %l = session line number
#   %s = session start timestamp
#   %v = virtual transaction ID
#   %x = transaction ID (0 if none)
#   %q = stop here in non-session
#        processes
#   %% = '%'
# e.g. '<%u%%%d> '
#log_lock_waits = off           # log lock waits >= deadlock_timeout
#log_statement = 'none'         # none, ddl, mod, all
#log_replication_commands = off
#log_temp_files = -1            # log temporary files equal or larger
# than the specified size in kilobytes;
# -1 disables, 0 logs all temp files
#log_timezone = 'GMT'
#------------------------------------------------------------------------------
# PROCESS TITLE
#------------------------------------------------------------------------------
#cluster_name = ''          # added to process titles if nonempty
# (change requires restart)
#update_process_title = on
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------
# - Query and Index Statistics Collector -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none         # none, pl, all
#track_activity_query_size = 1024   # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
# - Monitoring -
#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off
#------------------------------------------------------------------------------
# AUTOVACUUM
#------------------------------------------------------------------------------
#autovacuum = on            # Enable autovacuum subprocess?  'on'
# requires track_counts to also be on.
#log_autovacuum_min_duration = -1   # -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number
# of milliseconds.
#autovacuum_max_workers = 3     # max number of autovacuum subprocesses
# (change requires restart)
#autovacuum_naptime = 1min      # time between autovacuum runs
#autovacuum_vacuum_threshold = 50   # min number of row updates before
# vacuum
#autovacuum_analyze_threshold = 50  # min number of row updates before
# analyze
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
# (change requires restart)
#autovacuum_multixact_freeze_max_age = 400000000    # maximum multixact age
# before forced vacuum
# (change requires restart)
#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
# autovacuum, in milliseconds;
# -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
# autovacuum, -1 means use
# vacuum_cost_limit
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
# - Statement Behavior -
#client_min_messages = notice       # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   log
#   notice
#   warning
#   error
#search_path = '"$user", public'    # schema names
#row_security = on
#default_tablespace = ''        # a tablespace name, '' uses the default
#temp_tablespaces = ''          # a list of tablespace names, '' uses
# only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
#statement_timeout = 0          # in milliseconds, 0 is disabled
#lock_timeout = 0           # in milliseconds, 0 is disabled
#idle_in_transaction_session_timeout = 0    # in milliseconds, 0 is disabled
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
#vacuum_multixact_freeze_min_age = 5000000
#vacuum_multixact_freeze_table_age = 150000000
#vacuum_cleanup_index_scale_factor = 0.1    # fraction of total number of tuples
# before index cleanup, 0 always performs
# index cleanup
#bytea_output = 'hex'           # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_fuzzy_search_limit = 0
#gin_pending_list_limit = 4MB
# - Locale and Formatting -
#datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = 'GMT'
#timezone_abbreviations = 'Default'     # Select the set of available time zone
# abbreviations.  Currently, there are
#   Default
#   Australia (historical usage)
#   India
# You can create your own file in
# share/timezonesets/.
#extra_float_digits = 1         # min -15, max 3; any value >0 actually
# selects precise output mode
#client_encoding = sql_ascii        # actually, defaults to database
# encoding
# These settings are initialized by initdb, but they can be changed.
#lc_messages = 'C'          # locale for system error message
# strings
#lc_monetary = 'C'          # locale for monetary formatting
#lc_numeric = 'C'           # locale for number formatting
#lc_time = 'C'              # locale for time formatting
# default configuration for text search
#default_text_search_config = 'pg_catalog.simple'
# - Shared Library Preloading -
#shared_preload_libraries = ''  # (change requires restart)
#local_preload_libraries = ''
#session_preload_libraries = ''
#jit_provider = 'llvmjit'       # JIT library to use
# - Other Defaults -
#dynamic_library_path = '$libdir'
#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
#max_locks_per_transaction = 64     # min 10
# (change requires restart)
#max_pred_locks_per_transaction = 64    # min 10
# (change requires restart)
#max_pred_locks_per_relation = -2   # negative values mean
# (max_pred_locks_per_transaction
#  / -max_pred_locks_per_relation) - 1
#max_pred_locks_per_page = 2            # min 0
#------------------------------------------------------------------------------
# VERSION AND PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------
# - Previous PostgreSQL Versions -
#array_nulls = on
#backslash_quote = safe_encoding    # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#operator_precedence_warning = off
#quote_all_identifiers = off
#standard_conforming_strings = on
#synchronize_seqscans = on
# - Other Platforms and Clients -
#transform_null_equals = off
#------------------------------------------------------------------------------
# ERROR HANDLING
#------------------------------------------------------------------------------
#exit_on_error = off            # terminate session on any error?
#restart_after_crash = on       # reinitialize after backend crash?
#data_sync_retry = off          # retry or panic on failure to fsync
# data?
# (change requires restart)
#------------------------------------------------------------------------------
# CONFIG FILE INCLUDES
#------------------------------------------------------------------------------
# These options allow settings to be loaded from files other than the
# default postgresql.conf.
#include_dir = 'conf.d'         # include files ending in '.conf' from
# directory 'conf.d'
#include_if_exists = 'exists.conf'  # include file only if it exists
#include = 'special.conf'       # include file
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
# Add settings for extensions here

Það er allt, þú getur ræst gáma með skipuninni docker-compose up -d. Eða í sérstakri stjórnborði með skipuninni docker-compose up.

Svo, pakkarnir hafa verið settir upp, gagnagrunnurinn hefur verið ræstur, það eina sem er eftir er að eignast þá vini sín á milli. Til að gera þetta þarftu að bæta eftirfarandi skrá við verkefnisrótina: ormconfig.js:

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"
}
}

Þessi stilling verður notuð fyrir cli typeorm.

Við skulum skoða þessa stillingu nánar. Á línum 3 og 4 fáum við notendanafn og lykilorð frá umhverfisbreytunum. Þetta er þægilegt þegar þú ert með mörg umhverfi (dev, stage, prod osfrv.). Sjálfgefið er notendanafnið postgres og lykilorðið er dæmi. Restin af stillingunum er léttvæg, svo við munum einbeita okkur aðeins að áhugaverðustu breytunum:

  • samstilla - Gefur til kynna hvort gagnagrunnsskema ætti að vera sjálfkrafa búið til þegar forritið byrjar. Vertu varkár með þennan valkost og ekki nota hann í framleiðslu, annars muntu tapa gögnum. Þessi valkostur er þægilegur þegar forrit er þróað og villuleit. Sem valkostur við þennan valkost geturðu notað skipunina schema:sync frá CLI TypeORM.
  • dropSchema - endurstilla skema í hvert skipti sem tenging er komið á. Rétt eins og sá fyrri ætti aðeins að nota þennan valkost við þróun og villuleit á forritinu.
  • entities - hvaða leiðir á að leita að lýsingum á líkönum. Vinsamlegast athugaðu að leit eftir grímu er studd.
  • cli.entitiesDir er skráin þar sem líkön búin til úr TypeORM CLI ættu að vera geymd sjálfgefið.

Til þess að við getum notað alla eiginleika TypeORM í Nest forritinu okkar þurfum við að flytja inn eininguna TypeOrmModule в AppModule. Þeir. þitt AppModule mun líta svona út:

app.module.ts

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 {}

Eins og þú hefur kannski tekið eftir, aðferðin forRoot sama stillingar fyrir að vinna með gagnagrunninn er flutt og í ormconfig.ts skránni

Endanleg snerting er eftir - bættu við nokkrum verkefnum til að vinna með TypeORM í package.json. Staðreyndin er sú að CLI er skrifað í javascript og keyrir í nodejs umhverfinu. Hins vegar verða öll líkön okkar og flutningar skrifuð með vélriti. Þess vegna er nauðsynlegt að umbreyta flutningum okkar og líkönum áður en CLI er notað. Til þess þurfum við ts-node pakkann:

yarn add -D ts-node

Eftir það skaltu bæta nauðsynlegum skipunum við 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"

Fyrsta skipunin, typeorm, bætir við ts-node umbúðum til að keyra TypeORM cli. Skipanirnar sem eftir eru eru þægilegar flýtileiðir sem þú, sem verktaki, mun nota næstum á hverjum degi:
migration:generate — búa til flutninga byggða á breytingum á gerðum þínum.
migration:create — búa til tóman flutning.
migration:run — hefja fólksflutninga.
Jæja, það er það núna, við höfum bætt við nauðsynlegum pökkum, stillt forritið til að vinna með gagnagrunninum bæði frá cli og forritinu sjálfu og einnig ræst DBMS. Það er kominn tími til að bæta rökfræði við umsókn okkar.

Að setja upp pakka til að búa til CRUD

Með því að nota aðeins Nest geturðu búið til API sem gerir þér kleift að búa til, lesa, uppfæra og eyða einingu. Þessi lausn verður eins sveigjanleg og hægt er, en í sumum tilfellum óþarfi. Til dæmis, ef þú þarft að búa til frumgerð fljótt, geturðu oft fórnað sveigjanleika fyrir hraða þróunar. Margir rammar veita virkni til að búa til CRUD með því að lýsa gagnalíkani tiltekinnar einingar. Og Nest er engin undantekning! Þessi virkni er veitt af pakkanum @nestjsx/crud. Geta þess er mjög áhugaverð:

  • auðveld uppsetning og stillingar;
  • DBMS sjálfstæði;
  • öflugt fyrirspurnartungumál með getu til að sía, blaðsíðuflokka, flokka, hlaða samböndum og hreiðri einingar, skyndiminni osfrv.;
  • pakki til að búa til beiðnir á framhliðinni;
  • auðvelt að hnekkja stjórnunaraðferðum;
  • lítil stilling;
  • swagger skjalastuðningur.

Aðgerðinni er skipt í nokkra pakka:

  • @nestjsx/crud - grunnpakkann sem skreytandinn útvegar Crud() fyrir leiðargerð, uppsetningu og löggildingu;
  • @nestjsx/crud-request — pakki sem býður upp á fyrirspurnarsmið/þátta til notkunar á framendahliðinni;
  • @nestjsx/crud-typeorm — pakki til samþættingar við TypeORM, sem veitir grunn TypeOrmCrudService þjónustuna með CRUD aðferðum til að vinna með einingar í gagnagrunninum.

Í þessari kennslu þurfum við pakka hreiðurjsx/crud og hreiðurjsx/crud-typeorm. Fyrst skulum við setja þau

yarn add @nestjsx/crud class-transformer class-validator

Pakkar bekk-spennir и flokksprófari í þessari umsókn er krafist fyrir yfirlýsandi lýsingu á reglum um að umbreyta líkanatilvikum og staðfesta komandi beiðnir, í sömu röð. Þessir pakkar eru frá sama höfundi, þannig að viðmótin eru svipuð.

Bein útfærsla á CRUD

Við munum taka lista yfir notendur sem dæmi fyrirmynd. Notendur munu hafa eftirfarandi reiti: id, username, displayName, email. id - reitur fyrir sjálfvirka hækkun, email и username - einstakir reitir. Það er einfalt! Allt sem er eftir er að hrinda hugmyndinni okkar í framkvæmd í formi Nest forrits.
Fyrst þarftu að búa til einingu users, sem mun bera ábyrgð á að vinna með notendum. Við skulum nota cli frá NestJS og framkvæma skipunina í rótarskrá verkefnisins okkar nest g module users.

notendur hreiður g mát

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)

Í þessari einingu munum við bæta við einingamöppu, þar sem við munum hafa líkön af þessari einingu. Sérstaklega skulum við bæta hér skránni user.entity.ts með lýsingu á notendalíkaninu:

notandi.eining.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;
}

Til þess að þetta líkan sé „séð“ af umsókn okkar er það nauðsynlegt í einingunni UsersModule flytja inn TypeOrmModule eftirfarandi efni:

users.module.ts

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 {}

Það er, hér flytjum við inn TypeOrmModule, þar sem aðferðarbreytu forFeature Við tilgreinum lista yfir gerðir sem tengjast þessari einingu.

Allt sem er eftir er að búa til samsvarandi einingu í gagnagrunninum. Flutningskerfið þjónar í þessum tilgangi. Til að búa til flutning byggða á breytingum á gerðum þarftu að keyra skipunina npm run migration:generate -- CreateUserTable:

Spoiler titill

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

Við þurftum ekki að skrifa flutninginn handvirkt, allt gerðist með töfrum. Er þetta ekki kraftaverk! Það er þó ekki allt. Við skulum skoða flutningsskrána sem búið var til:

1563346135367-CreateUserTable.ts

import {MigrationInterface, QueryRunner} from "typeorm";
export class CreateUserTable1563346816726 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
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<any> {
await queryRunner.query(`DROP TABLE "user"`);
}
}

Eins og þú sérð var ekki aðeins aðferðin til að hefja flutninginn sjálfkrafa búin til, heldur einnig aðferðin til að snúa henni til baka. Frábært!
Það eina sem er eftir er að koma þessum fólksflutningum í gang. Þetta er gert með eftirfarandi skipun:

npm run migration:run.

Það er það, nú hafa skemabreytingar flutt í gagnagrunninn.
Næst munum við búa til þjónustu sem mun sjá um að vinna með notendum og erfa hana frá TypeOrmCrudService. Geymsla hagsmunaeiningarinnar verður að fara í færibreytu móðursmiðsins, í okkar tilviki User geymsla.

notendaþjónusta.ts

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<User>{
constructor(@InjectRepository(User) usersRepository: Repository<User>){
super(usersRepository);
}
}

Við munum þurfa þessa þjónustu í stjórnandanum users. Til að búa til stjórnanda skaltu slá inn stjórnborðið nest g controller users/controllers/users

hreiður g stjórnandi notendur/stýringar/notendur

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)

Við skulum opna þennan stjórnanda og breyta honum til að bæta við smá töfrum hreiðurjsx/crud. Á bekk UsersController Við skulum bæta við skreytingamanni eins og þessum:

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

Crud er skreytingamaður sem bætir við stjórnandann nauðsynlegum aðferðum til að vinna með líkanið. Gerð líkans er tilgreind í reitnum model.type skreytingarstillingar.
Annað skrefið er að útfæra viðmótið CrudController<User>. „Samsettur“ stýringarkóði lítur svona út:

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<User>{
constructor(public service: UsersService){}
}

Og það er allt! Nú styður stjórnandinn allt settið af aðgerðum með líkaninu! Trúirðu mér ekki? Við skulum prófa forritið okkar í aðgerð!

Að búa til fyrirspurnarforskrift í TestMace

Til að prófa þjónustu okkar munum við nota IDE til að vinna með API TestMace. Af hverju TestMace? Í samanburði við svipaðar vörur hefur það eftirfarandi kosti:

  • öflug vinna með breytur. Í augnablikinu eru nokkrar gerðir af breytum, sem hver um sig gegnir ákveðnu hlutverki: innbyggðar breytur, kvikar breytur, umhverfisbreytur. Hver breyta tilheyrir hnút með stuðningi við erfðakerfið;
  • Búðu til forskriftir auðveldlega án forritunar. Um þetta verður fjallað hér á eftir;
  • læsilegt snið sem gerir þér kleift að vista verkefnið í útgáfustýringarkerfum;
  • sjálfvirk útfylling, auðkenning á setningafræði, auðkenning á breytilegum gildum;
  • Stuðningur við API lýsingar með getu til að flytja inn frá Swagger.

Byrjum netþjóninn okkar með skipuninni npm start og reyndu að fá aðgang að notendalistanum. Listinn yfir notendur, miðað við uppsetningu stjórnanda okkar, er hægt að nálgast á vefslóðinni localhost:3000/users. Við skulum leggja fram beiðni á þessa slóð.
Eftir að hafa keyrt TestMace geturðu séð viðmót eins og þetta:

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Efst til vinstri er verkefnatré með rótarhnút Project. Við skulum reyna að búa til fyrstu beiðnina til að fá lista yfir notendur. Fyrir þetta munum við búa til RequestStep hnút Þetta er gert í samhengisvalmynd verkefnishnútsins Bæta við hnút -> RequestStep.

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Í URL reitnum skaltu líma localhost:3000/users og keyra beiðnina. Við munum fá kóða 200 með tómu fylki í svarhlutanum. Það er skiljanlegt, við höfum ekki bætt neinum við ennþá.
Við skulum búa til handrit sem mun innihalda eftirfarandi skref:

  1. búa til notanda;
  2. beiðni um auðkenni nýstofnaðs notanda;
  3. eytt eftir notandaauðkenni sem búið var til í skrefi 1.

Svo, við skulum fara. Til þæginda skulum við búa til hnút eins og Mappa. Í meginatriðum er þetta bara mappa þar sem við munum vista allt handritið. Til að búa til möppuhnút skaltu velja Verk úr samhengisvalmynd hnútsins Bæta við hnút -> Mappa. Við skulum hringja í hnútinn athuga-búa til. Inni í hnút athuga-búa til Við skulum búa til fyrstu beiðni okkar um að búa til notanda. Við skulum kalla á nýstofnaðan hnút búa til-notanda. Það er, í augnablikinu mun hnútastigveldið líta svona út:

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Við skulum fara í opna flipann búa til-notanda hnút. Sláum inn eftirfarandi færibreytur fyrir beiðnina:

  • Tegund beiðni - POST
  • Vefslóð - localhost:3000/notendur
  • Meginmál - JSON með gildi {"email": "[email protected]", "displayName": "New user", "username": "user"}

Við skulum uppfylla þessa beiðni. Umsókn okkar segir að skráin hafi verið búin til.

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Jæja, við skulum athuga þessa staðreynd. Til þess að geta starfað með auðkenni stofnaðs notanda í síðari skrefum verður að vista þessa færibreytu. Vélbúnaðurinn er fullkominn fyrir þetta. kvikar breytur. Við skulum nota dæmi okkar til að skoða hvernig á að vinna með þá. Í flokkaða flipa svarsins, við hlið auðkennishnútsins í samhengisvalmyndinni, veldu hlutinn Úthluta til breytu. Í svarglugganum verður þú að stilla eftirfarandi færibreytur:

  • Hnút — í hvorum forfeðranna á að búa til kraftmikla breytu. Við skulum velja athuga-búa til
  • Breytilegt nafn — heiti þessarar breytu. Við skulum hringja userId.

Svona lítur ferlið við að búa til kraftmikla breytu út:

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Nú, í hvert skipti sem þessi fyrirspurn er keyrð, verður gildi kviku breytunnar uppfært. Og vegna þess dynamic breytur styðja kerfi stigveldis arfleifð, breyta userId verður til í afkomendum athuga-búa til hnút af hvaða varpstigi sem er.
Þessi breyta mun nýtast okkur í næstu beiðni. Við munum nefnilega biðja um nýstofnaðan notanda. Sem barn hnúts athuga-búa til við munum búa til beiðni athuga hvort það sé til með færibreytu url jöfn localhost:3000/users/${$dynamicVar.userId}. Skoða hönnun ${variable_name} þetta er að fá gildi breytu. Vegna þess að Við erum með kraftmikla breytu, svo til að fá hana þarftu að fá aðgang að hlutnum $dynamicVar, þ.e.a.s. að fá fullkomlega aðgang að kvikri breytu userId mun líta svona út ${$dynamicVar.userId}. Við skulum framkvæma beiðnina og ganga úr skugga um að rétt sé beðið um gögnin.
Síðasta skrefið sem er eftir er að biðja um eyðingu. Við þurfum ekki aðeins á því að halda til að kanna virkni eyðingarinnar heldur líka, ef svo má segja, til að hreinsa til eftir okkur í gagnagrunninum, því Tölvupóst- og notendanafnsreitirnir eru einstakir. Svo, í ávísunar-búa hnútnum munum við búa til eyði-notandabeiðni með eftirfarandi breytum

  • Tegund beiðni - DELETE
  • slóð - localhost:3000/users/${$dynamicVar.userId}

Við skulum ræsa. Við bíðum. Við njótum niðurstöðunnar)

Jæja, nú getum við keyrt allt þetta handrit hvenær sem er. Til að keyra handritið þarftu að velja úr samhengisvalmyndinni athuga-búa til hnút atriði Hlaupa.

Fljótleg CRUD sköpun með nest, @nestjsx/crud og TestMace

Hnútarnir í handritinu verða keyrðir hver á eftir öðrum
Þú getur vistað þetta handrit í verkefninu þínu með því að keyra Skrá -> Vista verkefni.

Ályktun

Allir eiginleikar verkfæranna sem notuð voru gátu einfaldlega ekki passað inn í snið þessarar greinar. Eins og fyrir aðal sökudólginn - pakkann hreiðurjsx/crud - eftirfarandi efni eru enn afhjúpuð:

  • sérsniðin löggilding og umbreyting líkana;
  • öflugt fyrirspurnarmál og þægileg notkun þess að framan;
  • endurskilgreina og bæta nýjum aðferðum við hrástýringar;
  • swagger stuðningur;
  • stjórnun skyndiminni.

Hins vegar, jafnvel það sem lýst er í greininni, er nóg til að skilja að jafnvel slík framtaksramma eins og NestJS hefur verkfæri fyrir hraðvirka frumgerð forrita. Og svo flott IDE eins TestMace gerir þér kleift að halda ákveðnum hraða.

Frumkóði fyrir þessa grein ásamt verkefninu TestMace, fáanlegt í geymslunni https://github.com/TestMace/nest-rest. Til að opna verkefni TestMace gerðu það bara í appinu Skrá -> Opna verkefni.

Heimild: www.habr.com

Bæta við athugasemd