Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Hal-hazırda REST API veb proqramların hazırlanması üçün standarta çevrilərək inkişafı müstəqil hissələrə bölməyə imkan verir. Hal-hazırda UI üçün Angular, React, Vue və başqaları kimi müxtəlif məşhur çərçivələrdən istifadə olunur. Backend tərtibatçıları müxtəlif dillər və çərçivələr arasından seçim edə bilərlər. Bu gün kimi bir çərçivə haqqında danışmaq istərdim NestJS. Biz daxilik TestMace Biz onu daxili layihələr üçün fəal şəkildə istifadə edirik. Yuva və paketdən istifadə @nestjsx/crud, biz sadə CRUD tətbiqi yaradacağıq.

Niyə NestJS

Bu yaxınlarda JavaScript icmasında kifayət qədər çoxlu backend çərçivələri peyda oldu. Əgər funksionallıq baxımından Nest-ə oxşar imkanlar təqdim edirlərsə, o zaman bir şeydə mütləq qalib gəlir - bu memarlıqdır. Aşağıdakı NestJS xüsusiyyətləri sənaye proqramları yaratmağa və böyük komandalar üçün inkişaf miqyasını genişləndirməyə imkan verir:

  • əsas inkişaf dili kimi TypeScript istifadə edir. NestJS JavaScript-i dəstəkləsə də, bəzi funksiyalar işləməyə bilər, xüsusən üçüncü tərəf paketlərindən danışırıqsa;
  • boş birləşdirilmiş komponentlər yaratmağa imkan verən bir DI konteynerinin olması;
  • Çərçivənin funksionallığı müstəqil dəyişdirilə bilən komponentlərə bölünür. Məsələn, başlıq altında bir çərçivə olaraq istifadə edilə bilər ekspresbərkitmək, verilənlər bazası ilə işləmək üçün yuvadan qutuya bağlamalar təmin edir tipli, mongoose, davam etdirmək;
  • NestJS aqnostik platformadır və REST, GraphQL, Websockets, gRPC və s. dəstəkləyir.

Çərçivənin özü Angular frontend çərçivəsindən ilhamlanıb və konseptual olaraq onunla çoxlu ümumi cəhətlər var.

NestJS-in quraşdırılması və Layihənin yerləşdirilməsi

Nest paketi ehtiva edir yuva/cli, əsas proqram çərçivəsini tez bir zamanda yerləşdirməyə imkan verir. Gəlin bu paketi qlobal olaraq quraşdıraq:

npm install --global @nest/cli

Quraşdırıldıqdan sonra adla tətbiqimizin əsas çərçivəsini yaradacağıq yuva-rest. Bu, əmrdən istifadə etməklə edilir nest new nest-rest.

yuva yeni yuva-istirahət

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

Paket menecerimiz olaraq iplik seçəcəyik.
Bu zaman serveri əmrlə işə sala bilərsiniz npm start və ünvana gedir http://localhost:3000 əsas səhifəyə baxa bilərsiniz. Ancaq buna görə də biz bura toplaşmışıq və davam edirik.

Verilənlər bazası ilə işin qurulması

Bu məqalə üçün DBMS kimi PostrgreSQL-i seçdim. Zövqlər haqqında heç bir mübahisə yoxdur, mənim fikrimcə, bu, bütün lazımi imkanlara malik olan ən yetkin DBMS-dir. Artıq qeyd edildiyi kimi, Nest verilənlər bazası ilə işləmək üçün müxtəlif paketlərlə inteqrasiyanı təmin edir. Çünki Seçimim PostgreSQL-ə düşdüyü üçün TypeORM-i ORM kimi seçmək məntiqli olardı. Verilənlər bazası ilə inteqrasiya üçün lazımi paketləri quraşdıraq:

yarn add typeorm @nestjs/typeorm pg

Hər bir paket nə üçün lazımdır:

  1. typeorm - birbaşa ORM-nin özündən bir paket;
  2. @nestjs/typeorm - NestJS üçün TypeORM paketi. Layihə modullarına idxal üçün modullar, həmçinin köməkçi dekoratorlar dəsti əlavə edir;
  3. pg - PostgreSQL ilə işləmək üçün sürücü.

Tamam, paketlər quraşdırılıb, indi verilənlər bazasının özünü işə salmalısınız. Verilənlər bazasını yerləşdirmək üçün aşağıdakı məzmunla docker-compose.yml-dən istifadə edəcəyəm:

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

Gördüyünüz kimi, bu fayl 2 konteynerin işə salınmasını konfiqurasiya edir:

  1. db birbaşa verilənlər bazasını ehtiva edən konteynerdir. Bizim vəziyyətimizdə postgresql 11.2 versiyası istifadə olunur;
  2. adminer - verilənlər bazası meneceri. Verilənlər bazasına baxmaq və idarə etmək üçün veb interfeysi təmin edir.

tcp əlaqələri ilə işləmək üçün aşağıdakı konfiqurasiyanı əlavə etdim.

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

Hamısı budur, əmrlə konteynerlərə başlaya bilərsiniz docker-compose up -d. Və ya komanda ilə ayrı bir konsolda docker-compose up.

Deməli, paketlər quraşdırılıb, verilənlər bazası işə salınıb, sadəcə onları bir-biri ilə dostlaşdırmaq qalır. Bunun üçün layihənin kökünə aşağıdakı faylı əlavə etməlisiniz: 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"
}
}

Bu konfiqurasiya cli typeorm üçün istifadə olunacaq.

Bu konfiqurasiyaya daha ətraflı baxaq. 3 və 4-cü sətirlərdə istifadəçi adı və şifrəni mühit dəyişənlərindən alırıq. Bir neçə mühitiniz (inkişaf, mərhələ, məhsul və s.) olduqda bu rahatdır. Varsayılan olaraq, istifadəçi adı postgres və parol nümunədir. Konfiqurasiyanın qalan hissəsi əhəmiyyətsizdir, buna görə də biz yalnız ən maraqlı parametrlərə diqqət yetirəcəyik:

  • sinxronizasiya - Proqram başlayanda verilənlər bazası sxeminin avtomatik olaraq yaradılıb-yaratılmamalı olduğunu göstərir. Bu seçimlə diqqətli olun və istehsalda istifadə etməyin, əks halda məlumatları itirəcəksiniz. Bu seçim proqramın işlənib hazırlanması və sazlanması zamanı əlverişlidir. Bu seçimə alternativ olaraq əmrdən istifadə edə bilərsiniz schema:sync CLI TypeORM-dan.
  • dropSchema - hər dəfə əlaqə qurulanda sxemi yenidən qurun. Əvvəlki kimi, bu seçim yalnız tətbiqin inkişafı və sazlanması zamanı istifadə edilməlidir.
  • obyektlər - modellərin təsvirlərini axtarmaq üçün hansı yollar. Nəzərə alın ki, maska ​​ilə axtarış dəstəklənir.
  • cli.entitiesDir, TypeORM CLI-dən yaradılmış modellərin standart olaraq saxlanmalı olduğu qovluqdur.

Nest tətbiqimizdə TypeORM-in bütün xüsusiyyətlərindən istifadə edə bilməyimiz üçün modulu idxal etməliyik. TypeOrmModule в AppModule. Bunlar. sənin AppModule belə görünəcək:

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

Bildiyiniz kimi, üsul forRoot verilənlər bazası ilə işləmək üçün eyni konfiqurasiya ormconfig.ts faylında olduğu kimi ötürülür

Son toxunma qalır - package.json-da TypeORM ilə işləmək üçün bir neçə tapşırıq əlavə edin. Fakt budur ki, CLI javascript-də yazılıb və nodejs mühitində işləyir. Bununla belə, bütün modellərimiz və köçürmələrimiz makinada yazılacaq. Buna görə də, CLI-dən istifadə etməzdən əvvəl miqrasiyalarımızı və modellərimizi köçürmək lazımdır. Bunun üçün bizə ts-node paketi lazımdır:

yarn add -D ts-node

Bundan sonra package.json-a lazımi əmrləri əlavə edin:

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

Birinci əmr, typeorm, TypeORM cli-ni işə salmaq üçün ts-node sarğı əlavə edir. Qalan əmrlər, bir tərtibatçı olaraq, demək olar ki, hər gün istifadə edəcəyiniz rahat qısa yollardır:
migration:generate — modellərinizdə dəyişikliklərə əsaslanan miqrasiyaların yaradılması.
migration:create — boş miqrasiya yaratmaq.
migration:run - miqrasiyaların başlanması.
Bəli, indi belədir, biz lazımi paketləri əlavə etdik, proqramı həm cli-dən, həm də proqramın özündən verilənlər bazası ilə işləmək üçün konfiqurasiya etdik, həmçinin DBMS-ni işə saldıq. Tətbiqimizə məntiq əlavə etməyin vaxtı gəldi.

CRUD yaratmaq üçün paketlərin quraşdırılması

Yalnız Nest-dən istifadə edərək, siz obyekt yaratmağa, oxumağa, yeniləməyə və silməyə imkan verən API yarada bilərsiniz. Bu həll mümkün qədər çevik olacaq, lakin bəzi hallarda lazımsız olacaq. Məsələn, tez bir prototip yaratmaq lazımdırsa, tez-tez inkişaf sürəti üçün çevikliyi qurban verə bilərsiniz. Bir çox çərçivələr müəyyən bir qurumun məlumat modelini təsvir etməklə CRUD yaratmaq üçün funksionallıq təmin edir. Və Nest də istisna deyil! Bu funksionallıq paket tərəfindən təmin edilir @nestjsx/crud. Onun imkanları çox maraqlıdır:

  • asan quraşdırma və konfiqurasiya;
  • DBMS müstəqilliyi;
  • filtrləmə, səhifələşdirmə, çeşidləmə, əlaqələri və iç-içə obyektləri yükləmək, keşləmə və s. imkanı olan güclü sorğu dili;
  • ön hissədə sorğu yaratmaq üçün paket;
  • nəzarətçi üsullarının asan ləğvi;
  • kiçik konfiqurasiya;
  • swagger sənəd dəstəyi.

Funksionallıq bir neçə paketə bölünür:

  • @nestjsx/crud - dekoratorun təmin etdiyi əsas paket Xam() marşrutun yaradılması, konfiqurasiyası və təsdiqi üçün;
  • @nestjsx/crud-request — ön tərəfdə istifadə üçün sorğu qurucusunu/parserini təmin edən paket;
  • @nestjsx/crud-typeorm — verilənlər bazasındakı obyektlərlə işləmək üçün əsas TypeOrmCrudService xidmətini CRUD metodları ilə təmin edən TypeORM ilə inteqrasiya paketi.

Bu dərslikdə paketlərə ehtiyacımız olacaq yuvajsx/crud və yuvajsx/crud-typeorm. Əvvəlcə onları qoyaq

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

Paketlər sinif transformatoru и sinif təsdiqləyicisi bu ərizədə müvafiq olaraq model instansiyalarının dəyişdirilməsi və daxil olan sorğuların təsdiqi qaydalarının bəyanedici təsviri tələb olunur. Bu paketlər eyni müəllifdəndir, ona görə də interfeyslər oxşardır.

CRUD-un birbaşa həyata keçirilməsi

Nümunə olaraq istifadəçilərin siyahısını götürəcəyik. İstifadəçilər aşağıdakı sahələrə sahib olacaqlar: id, username, displayName, email. id - avtomatik artan sahə, email и username - unikal sahələr. Bu sadədir! Qalır ki, ideyamızı Nest tətbiqi şəklində həyata keçirək.
Əvvəlcə bir modul yaratmalısınız users, istifadəçilərlə işləməyə kim cavabdeh olacaq. NestJS-dən cli-dən istifadə edək və layihəmizin kök kataloqunda əmri yerinə yetirək nest g module users.

nest g modul istifadəçiləri

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)

Bu modulda biz varlıqlar qovluğunu əlavə edəcəyik, burada bu modulun modelləri olacaq. Xüsusilə, istifadəçi modelinin təsviri ilə user.entity.ts faylını buraya əlavə edək:

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

Bu modelin tətbiqimiz tərəfindən "görülməsi" üçün modulda lazımdır UsersModule idxal TypeOrmModule aşağıdakı məzmun:

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

Yəni burada idxal edirik TypeOrmModule, burada metod parametri kimi forFeature Bu modulla əlaqəli modellərin siyahısını göstəririk.

Yalnız verilənlər bazasında müvafiq qurumu yaratmaq qalır. Miqrasiya mexanizmi bu məqsədlərə xidmət edir. Modellərdəki dəyişikliklərə əsaslanan miqrasiya yaratmaq üçün əmri yerinə yetirməlisiniz npm run migration:generate -- CreateUserTable:

spoyler başlığı

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

Miqrasiyanı əl ilə yazmalı deyildik, hər şey sehrli şəkildə baş verdi. Bu möcüzə deyilmi? Lakin, bu, hamısı deyil. Yaradılmış miqrasiya faylına nəzər salaq:

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"`);
}
}

Gördüyünüz kimi, təkcə miqrasiyaya başlamaq üçün deyil, həm də onu geri qaytarmaq üsulu avtomatik olaraq yaradıldı. Fantastik!
Bu miqrasiyanı yaymaq qalır. Bu, aşağıdakı əmrlə edilir:

npm run migration:run.

Budur, indi sxem dəyişiklikləri verilənlər bazasına köçdü.
Sonra, istifadəçilərlə işləmək üçün cavabdeh olacaq və onu miras alacaq bir xidmət yaradacağıq TypeOrmCrudService. Maraq obyektinin deposu ana konstruktorun parametrinə ötürülməlidir, bizim vəziyyətimizdə User anbar.

users.service.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);
}
}

Bu xidmətə nəzarətçidə ehtiyacımız olacaq users. Nəzarətçi yaratmaq üçün konsolda yazın nest g controller users/controllers/users

nest g nəzarətçi istifadəçiləri/nəzarətçiləri/istifadəçiləri

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)

Gəlin bu nəzarətçini açaq və bir az sehr əlavə etmək üçün onu redaktə edək yuvajsx/crud. Sinif üzrə UsersController Belə bir dekorator əlavə edək:

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

Xam modellə işləmək üçün lazımi üsulları nəzarətçiyə əlavə edən dekoratordur. Modelin növü sahədə göstərilir model.type dekorator konfiqurasiyaları.
İkinci addım interfeysin həyata keçirilməsidir CrudController<User>. "Yığılmış" nəzarətçi kodu belə görünür:

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

Və hamısı budur! İndi nəzarətçi model ilə bütün əməliyyatlar dəstini dəstəkləyir! Mənə inanmırsan? Tətbiqimizi hərəkətdə sınayaq!

TestMace-də Sorğu Skriptinin yaradılması

Xidmətimizi sınamaq üçün API ilə işləmək üçün IDE-dən istifadə edəcəyik TestMace. Niyə TestMace? Oxşar məhsullarla müqayisədə o, aşağıdakı üstünlüklərə malikdir:

  • dəyişənlərlə güclü iş. Hazırda bir neçə növ dəyişən mövcuddur ki, onların hər biri xüsusi rol oynayır: daxili dəyişənlər, dinamik dəyişənlər, mühit dəyişənləri. Hər bir dəyişən irsiyyət mexanizmini dəstəkləyən bir node aiddir;
  • Proqramlaşdırmadan asanlıqla skript yaradın. Bu aşağıda müzakirə olunacaq;
  • layihəni versiyaya nəzarət sistemlərində saxlamağa imkan verən insan tərəfindən oxuna bilən format;
  • avtomatik tamamlama, sintaksisin vurğulanması, dəyişən dəyərin vurğulanması;
  • Swagger-dən idxal etmək imkanı ilə API təsviri dəstəyi.

Komanda ilə serverimizə başlayaq npm start və istifadəçilər siyahısına daxil olmağa çalışın. Kontroller konfiqurasiyamızdan asılı olaraq istifadəçilərin siyahısını localhost:3000/users url-dən əldə etmək olar. Gəlin bu url-ə sorğu verək.
TestMace-i işə saldıqdan sonra belə bir interfeys görə bilərsiniz:

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Sol yuxarıda kök nodu olan layihə ağacı var Layihə. İstifadəçilərin siyahısını əldə etmək üçün ilk sorğunu yaratmağa çalışaq. Bunun üçün biz yaradacağıq Request Step düyün Bu, Layihə qovşağının kontekst menyusunda edilir Node əlavə et -> RequestStep.

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

URL sahəsinə localhost:3000/users yazın və sorğunu işə salın. Cavab orqanında boş massivlə 200 kodu alacağıq. Bu başa düşüləndir, hələ heç kimi əlavə etməmişik.
Gəlin aşağıdakı addımları ehtiva edən bir skript yaradaq:

  1. istifadəçi yaratmaq;
  2. yeni yaradılmış istifadəçinin id-si üçün sorğu;
  3. 1-ci addımda yaradılmış istifadəçi identifikatoru ilə silinməsi.

Beləliklə, gedək. Rahatlıq üçün, kimi bir node yaradaq Qovluq. Əslində, bu, bütün skripti saxlayacağımız bir qovluqdur. Qovluq qovşağı yaratmaq üçün qovşağın kontekst menyusundan Layihə seçin Düyün əlavə et -> Qovluq. node zəng edək yoxlamaq-yaratmaq. Bir node daxilində yoxlamaq-yaratmaq İstifadəçi yaratmaq üçün ilk sorğumuzu yaradaq. Yeni yaradılmış qovşağı çağıraq yaratmaq-istifadəçi. Yəni, hazırda node iyerarxiyası belə görünəcək:

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Gəlin açıq sekmeye keçək yaratmaq-istifadəçi düyün. Sorğu üçün aşağıdakı parametrləri daxil edək:

  • Sorğu növü - POST
  • URL - localhost: 3000/istifadəçilər
  • Bədən - dəyəri olan JSON {"email": "[email protected]", "displayName": "New user", "username": "user"}

Gəlin bu istəyi yerinə yetirək. Tətbiqimiz qeydin yaradıldığını bildirir.

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Yaxşı, gəlin bu faktı yoxlayaq. Sonrakı addımlarda yaradılmış istifadəçinin id-si ilə işləmək üçün bu parametr yadda saxlanmalıdır. Mexanizm bunun üçün mükəmməldir. dinamik dəyişənlər. Onlarla necə işləmək üçün nümunəmizdən istifadə edək. Cavabın təhlil edilmiş sekmesinde, kontekst menyusundakı id nodeunun yanında elementi seçin Dəyişənə təyin edin. Dialoq qutusunda aşağıdakı parametrləri təyin etməlisiniz:

  • Düyün — hansı əcdadlarda dinamik dəyişən yaratmaq. Gəlin seçək yoxlamaq-yaratmaq
  • Dəyişən ad — bu dəyişənin adı. zəng edək userId.

Dinamik dəyişən yaratma prosesi belə görünür:

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

İndi bu sorğu hər dəfə yerinə yetirildikdə, dinamik dəyişənin dəyəri yenilənəcək. Və ona görə dinamik dəyişənlər iyerarxik irsiyyət mexanizmini dəstəkləyir, dəyişən userId nəsillərdə mövcud olacaqdır yoxlamaq-yaratmaq istənilən yuva səviyyəli düyün.
Bu dəyişən növbəti sorğuda bizim üçün faydalı olacaq. Məhz, biz yeni yaradılmış istifadəçini tələb edəcəyik. Bir node uşağı kimi yoxlamaq-yaratmaq sorğu yaradacağıq olub olmadığını yoxlayın parametri ilə url bərabərdir localhost:3000/users/${$dynamicVar.userId}. Dizayna baxın ${variable_name} bu dəyişənin qiymətini alır. Çünki Bizdə dinamik dəyişən var, ona görə də onu əldə etmək üçün obyektə daxil olmaq lazımdır $dynamicVar, yəni dinamik dəyişənə tamamilə daxil olmaq userId belə görünəcək ${$dynamicVar.userId}. Sorğunu yerinə yetirək və məlumatların düzgün tələb olunduğuna əmin olaq.
Qalan son addım silinməyi tələb etməkdir. Bizə təkcə silinmə əməliyyatını yoxlamaq üçün deyil, həm də belə desək, verilənlər bazasında özümüzü təmizləmək üçün lazımdır, çünki E-poçt və istifadəçi adı sahələri unikaldır. Beləliklə, check-create node-da aşağıdakı parametrlərlə istifadəçi silmə sorğusu yaradacağıq

  • Sorğu növü - SİL
  • URL - localhost:3000/users/${$dynamicVar.userId}

başlayaq. Gözləyirik. Nəticədən zövq alırıq)

İndi biz bu skripti istənilən vaxt işlədə bilərik. Skripti işə salmaq üçün kontekst menyusundan seçim etməlisiniz yoxlamaq-yaratmaq node elementi qaçış.

Nest, @nestjsx/crud və TestMace ilə sürətli CRUD yaradılması

Skriptdəki qovşaqlar bir-birinin ardınca yerinə yetiriləcək
Bu skripti işləməklə layihənizdə saxlaya bilərsiniz Fayl -> Layihəni saxla.

Nəticə

İstifadə olunan vasitələrin bütün xüsusiyyətləri sadəcə olaraq bu məqalənin formatına uyğun gəlmədi. Əsas günahkar - paketə gəldikdə yuvajsx/crud - aşağıdakı mövzular açıq qalır:

  • modellərin fərdi təsdiqi və transformasiyası;
  • güclü sorğu dili və onun rahat istifadəsi;
  • yenidən təyin edilməsi və xam kontrollerlərə yeni metodların əlavə edilməsi;
  • cəld dəstək;
  • keş idarəetmə.

Bununla belə, hətta məqalədə təsvir olunanlar belə başa düşmək üçün kifayətdir ki, hətta NestJS kimi korporativ çərçivədə sürətli tətbiq prototipləri üçün alətlər var. Və belə bir sərin IDE kimi TestMace verilmiş tempi saxlamağa imkan verir.

Layihə ilə birlikdə bu məqalənin mənbə kodu TestMace, repozitoriyada mövcuddur https://github.com/TestMace/nest-rest. Layihə açmaq üçün TestMace bunu sadəcə proqramda edin Fayl -> Layihəni açın.

Mənbə: www.habr.com

Добавить комментарий