د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

اوس مهال، REST API د ویب غوښتنلیک پراختیا لپاره یو معیار ګرځیدلی، پراختیا ته اجازه ورکوي چې په خپلواکو برخو ویشل شي. مختلف مشهور چوکاټونه لکه Angular، React، Vue او نور دا مهال د UI لپاره کارول کیږي. د پس منظر پراختیا کونکي کولی شي د ډیری ژبو او چوکاټونو څخه غوره کړي. نن زه غواړم د داسې چوکاټ په اړه وغږیږم NestJS. موږ په کې یو TestMace موږ دا په فعاله توګه د داخلي پروژو لپاره کاروو. د ځالې او کڅوړې کارول @nestjsx/crud، موږ به یو ساده CRUD غوښتنلیک جوړ کړو.

ولې NestJS

په دې وروستیو کې، د جاواسکریپټ په ټولنه کې د پس منظر ډیری چوکاټونه ښکاره شوي. او که د فعالیت په شرایطو کې دوی Nest ته ورته وړتیاوې چمتو کوي، نو په یو شی کې دا یقینا وګټي - دا معمار دی. لاندې د NestJS ځانګړتیاوې تاسو ته اجازه درکوي صنعتي غوښتنلیکونه جوړ کړئ او لوی ټیمونو ته پراختیا ورکړئ:

  • د اصلي پراختیا ژبې په توګه د ټایپ سکریپټ کارول. که څه هم NestJS د جاواسکریپټ ملاتړ کوي، ځینې فعالیت ممکن کار ونکړي، په ځانګړې توګه که موږ د دریمې ډلې کڅوړو په اړه خبرې کوو؛
  • د DI کانټینر شتون، کوم چې تاسو ته اجازه درکوي په نرمه توګه جوړه شوې برخې جوړې کړئ؛
  • د چوکاټ فعالیت پخپله د تبادلې وړ خپلواکو برخو ویشل شوی. د مثال په توګه، د هود لاندې د چوکاټ په توګه کارول کیدی شي د څرګندولو، او چټک کول، د ډیټابیس سره کار کولو لپاره ، د بکس څخه بهر ځاله دې ته پابندۍ چمتو کوي ټایپرم, مغز, سلګول;
  • NestJS پلیټ فارم اګنوسټیک دی او د REST، GraphQL، Websockets، gRPC، او داسې نورو ملاتړ کوي.

چوکاټ پخپله د انګولر فرنټ اینډ چوکاټ څخه الهام اخیستل شوی او په مفهوم سره ډیر ورته والی لري.

د NestJS نصب کول او د پروژې پلي کول

Nest یو بسته لري نسټ/cli، کوم چې تاسو ته اجازه درکوي په چټکۍ سره د غوښتنلیک اساسي چوکاټ ځای په ځای کړئ. راځئ چې دا بسته په نړیواله کچه نصب کړو:

npm install --global @nest/cli

د نصبولو وروسته، موږ به د نوم سره زموږ د غوښتنلیک بنسټیز چوکاټ تولید کړو Nest-rest. دا د کمانډ په کارولو سره ترسره کیږي nest new nest-rest.

نوی ځنځیر - آرام

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

موږ به سوت زموږ د کڅوړې مدیر په توګه غوره کړو.
پدې وخت کې تاسو کولی شئ سرور د قوماندې سره پیل کړئ npm start او پته ته ځي http://localhost:3000 تاسو کولی شئ اصلي پاڼه وګورئ. په هرصورت، دا نه ده چې موږ دلته راټول شوي یو او موږ پرمخ روان یو.

د ډیټابیس سره د کار تنظیم کول

ما د دې مقالې لپاره PostrgreSQL د DBMS په توګه غوره کړ. د ذوقونو په اړه هیڅ شخړه نشته؛ زما په نظر، دا خورا بالغ DBMS دی، ټول اړین وړتیاوې لري. لکه څنګه چې دمخه یادونه وشوه ، Nest د ډیټابیسونو سره کار کولو لپاره د مختلف کڅوړو سره ادغام چمتو کوي. ځکه څرنګه چې زما انتخاب په PostgreSQL کې راوتلی، نو دا به منطقي وي چې TypeORM د ORM په توګه غوره کړئ. راځئ چې د ډیټابیس سره د ادغام لپاره اړین کڅوړې نصب کړو:

yarn add typeorm @nestjs/typeorm pg

په ترتیب سره، د هر کڅوړې لپاره څه ته اړتیا ده:

  1. typeorm - یو بسته مستقیم له ORM څخه؛
  2. @nestjs/typeorm - د NestJS لپاره TypeORM بسته. د پروژې ماډلونو کې د واردولو لپاره ماډلونه اضافه کوي، په بیله بیا د مرستندویه سینګار کونکو سیټ؛
  3. pg - د PostgreSQL سره کار کولو لپاره ډرایور.

ښه، کڅوړې نصب شوي، اوس تاسو اړتیا لرئ چې پخپله ډیټابیس پیل کړئ. د ډیټابیس د ځای په ځای کولو لپاره، زه به د لاندې منځپانګې سره docker-compose.yml وکاروم:

ډاکر - 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

لکه څنګه چې تاسو لیدلی شئ، دا فایل د 2 کانټینرونو لانچ تنظیموي:

  1. db یو کانټینر دی چې مستقیم ډیټابیس لري. زموږ په قضیه کې، د postgresql نسخه 11.2 کارول کیږي؛
  2. اډمینر - د ډیټابیس مدیر. د ډیټابیس لیدو او اداره کولو لپاره ویب انٹرفیس چمتو کوي.

د tcp ارتباطاتو سره کار کولو لپاره ، ما لاندې تشکیل اضافه کړ.

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

دا ټول دي، تاسو کولی شئ د کمانډ سره کانټینرونه پیل کړئ docker-compose up -d. یا په جلا کنسول کې د قوماندې سره docker-compose up.

نو، کڅوړې نصب شوي، ډیټابیس په لاره اچول شوی، ټول هغه څه چې پاتې دي هغه د یو بل سره ملګري کول دي. د دې کولو لپاره، تاسو اړتیا لرئ چې لاندې فایل د پروژې روټ ته اضافه کړئ: 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"
}
}

دا ترتیب به د کلی ټایپورم لپاره وکارول شي.

راځئ چې دا ترتیب په ډیر تفصیل سره وګورو. په 3 او 4 کرښو کې موږ د چاپیریال تغیراتو څخه کارن نوم او پټنوم ترلاسه کوو. دا مناسب دی کله چې تاسو ډیری چاپیریال ولرئ (dev، stage، prod، او نور). په ډیفالټ کې ، کارن نوم پوسټګریس دی او پټنوم یې مثال دی. پاتې تشکیلات کوچني دي، نو موږ به یوازې په خورا زړه پورې پیرامیټونو تمرکز وکړو:

  • همغږي کول - په ګوته کوي چې ایا د ډیټابیس سکیما باید په اوتومات ډول رامینځته شي کله چې غوښتنلیک پیل شي. د دې اختیار سره محتاط اوسئ او په تولید کې یې مه کاروئ، که نه نو تاسو به ډاټا له لاسه ورکړئ. دا اختیار مناسب دی کله چې د غوښتنلیک رامینځته کول او ډیبګ کول. د دې اختیار د بدیل په توګه، تاسو کولی شئ کمانډ وکاروئ schema:sync د CLI TypeORM څخه.
  • dropSchema - هرکله چې اړیکه جوړه شي سکیما بیا تنظیم کړئ. د تیر په څیر، دا اختیار باید یوازې د غوښتنلیک پراختیا او ډیبګ کولو پرمهال وکارول شي.
  • ادارې - د ماډلونو توضیحاتو لپاره کومې لارې. مهرباني وکړئ په یاد ولرئ چې د ماسک لخوا لټون ملاتړ کیږي.
  • cli.entitiesDir هغه لارښود دی چیرې چې د TypeORM CLI څخه جوړ شوي ماډلونه باید په ډیفالټ ذخیره شي.

د دې لپاره چې موږ وکولی شو زموږ د Nest غوښتنلیک کې د TypeORM ټولې ځانګړتیاوې وکاروو، موږ اړتیا لرو چې ماډل وارد کړو TypeOrmModule в AppModule. هغوی. ستاسو AppModule دا به داسې ښکاري:

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

لکه څنګه چې تاسو شاید یادونه کړې وي، طریقه forRoot د ډیټابیس سره د کار کولو لپاره ورته ترتیب د ormconfig.ts فایل کې لیږدول کیږي

وروستی تماس پاتې دی - په package.json کې د TypeORM سره کار کولو لپاره ډیری دندې اضافه کړئ. حقیقت دا دی چې CLI په جاوا سکرپٹ کې لیکل شوی او د نوډز چاپیریال کې چلیږي. په هرصورت، زموږ ټول ماډلونه او مهاجرتونه به په ټایپ سکریپټ کې لیکل شي. له همدې امله، دا اړینه ده چې د CLI کارولو دمخه زموږ مهاجرت او ماډلونه انتقال کړئ. د دې لپاره موږ د ts-node بسته ته اړتیا لرو:

yarn add -D ts-node

له هغې وروسته، اړین حکمونه په package.json کې اضافه کړئ:

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

لومړی کمانډ، ټایپورم، د TypeORM کلی چلولو لپاره د ts-node ریپر اضافه کوي. پاتې کمانډونه مناسب شارټ کټونه دي چې تاسو به د پراختیا کونکي په توګه نږدې هره ورځ وکاروئ:
migration:generate - ستاسو په ماډلونو کې د بدلونونو پراساس مهاجرت رامینځته کول.
migration:create - د خالي مهاجرت رامینځته کول.
migration:run - د مهاجرت پیل کول.
ښه، دا اوس دی، موږ اړین کڅوړې اضافه کړې، غوښتنلیک یې ترتیب کړی ترڅو د ډیټابیس سره کار وکړي دواړه د کلی او غوښتنلیک څخه، او همدارنګه یې DBMS پیل کړ. دا وخت دی چې زموږ غوښتنلیک ته منطق اضافه کړئ.

د CRUD جوړولو لپاره د کڅوړو نصب کول

یوازې د Nest په کارولو سره ، تاسو کولی شئ یو API رامینځته کړئ چې تاسو ته اجازه درکوي یو اداره رامینځته کړئ ، لوستل یې کړئ ، تازه کړئ او حذف کړئ. دا حل به د امکان تر حده انعطاف منونکی وي، مګر په ځینو مواردو کې به بې ځایه وي. د مثال په توګه، که تاسو اړتیا لرئ په چټکۍ سره یو پروټوټایپ جوړ کړئ، تاسو کولی شئ ډیری وختونه د پرمختګ سرعت لپاره انعطاف قرباني کړئ. ډیری چوکاټونه د یوې ځانګړې ادارې ډیټا ماډل تشریح کولو سره د CRUD تولید لپاره فعالیت چمتو کوي. او Nest هیڅ استثنا نه ده! دا فعالیت د کڅوړې لخوا چمتو شوی @nestjsx/crud. د دې وړتیاوې خورا په زړه پوري دي:

  • اسانه نصب او ترتیب؛
  • د DBMS خپلواکي؛
  • د پوښتنې ځواکمنه ژبه چې د فلټر کولو، پاڼې کولو، ترتیب کولو، بار کولو اړیکو او د نیست شوي ادارو، کیچ کولو او نورو وړتیا سره؛
  • په مخکینۍ پای کې د غوښتنو تولید لپاره بسته؛
  • د کنټرولر میتودونو اسانه تکرار؛
  • کوچنی تشکیل؛
  • د swagger اسنادو ملاتړ.

فعالیت په څو کڅوړو ویشل شوی دی:

  • @nestjsx/crud - اساسي بسته چې سینګار چمتو کوي کرډ() د لارې د تولید، ترتیب او اعتبار لپاره؛
  • @nestjsx/crud-request - یوه بسته چې د پوښتنلیک جوړونکی / پارسر چمتو کوي د مخکني اړخ کارولو لپاره؛
  • @nestjsx/crud-typeorm - د TypeORM سره د ادغام لپاره یوه کڅوړه، په ډیټابیس کې د ادارو سره کار کولو لپاره د CRUD میتودونو سره د لومړني TypeOrmCrudService خدمت چمتو کوي.

پدې ټیوټوریل کې به موږ کڅوړو ته اړتیا ولرو نسټjsx/crud او نسټjsx/crud-typeorm. لومړی، راځئ چې دوی واچوو

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

بسته بندي ټولګي ټرانسفارمر и د ټولګي تصدیق کوونکی په دې غوښتنلیک کې په ترتیب سره د ماډل مثالونو بدلولو او د راتلونکو غوښتنو اعتبار کولو لپاره د مقرراتو اعلاناتي توضیحاتو ته اړتیا ده. دا کڅوړې د ورته لیکوال څخه دي ، نو انٹرفیس ورته دي.

د CRUD مستقیم تطبیق

موږ به د مثال په توګه د کاروونکو لیست واخلو. کاروونکي به لاندې ساحې ولري: id, username, displayName, email. id - د اتوماتیک زیاتوالي ساحه، email и username - ځانګړې ساحې. دا ساده ده! ټول هغه څه چې پاتې دي د Nest غوښتنلیک په بڼه زموږ نظر پلي کول دي.
لومړی تاسو اړتیا لرئ یو ماډل جوړ کړئ users، څوک به د کاروونکو سره د کار کولو مسؤل وي. راځئ چې د NestJS څخه کلی وکاروو او زموږ د پروژې په روټ ډایرکټر کې کمانډ اجرا کړو nest g module users.

د نسټ جی ماډل کاروونکي

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

په دې ماډل کې به موږ د ادارو فولډر اضافه کړو، چیرې چې موږ به د دې ماډل ماډلونه ولرو. په ځانګړې توګه، راځئ چې دلته د user.entity.ts فایل د کارونکي ماډل توضیح سره اضافه کړو:

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

د دې لپاره چې دا ماډل زموږ د غوښتنلیک لخوا "لیدل" شي، دا په ماډل کې اړین دی UsersModule واردول TypeOrmModule لاندې مواد:

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

دا، دلته موږ واردوو TypeOrmModule، چیرې چې د میتود پیرامیټر په توګه forFeature موږ د دې ماډل پورې اړوند ماډلونو لیست په ګوته کوو.

ټول هغه څه چې پاتې دي په ډیټابیس کې د اړونده ادارې رامینځته کول دي. د مهاجرت میکانیزم د دې موخو لپاره کار کوي. په ماډلونو کې د بدلونونو پراساس د مهاجرت رامینځته کولو لپاره ، تاسو اړتیا لرئ کمانډ چل کړئ npm run migration:generate -- CreateUserTable:

سپوئلر سرلیک

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

موږ اړتیا نه درلوده چې مهاجرت په لاسي ډول ولیکو، هرڅه په جادو سره پیښ شوي. ایا دا معجزه نه ده! په هرصورت، دا ټول نه دي. راځئ چې جوړ شوي مهاجرت فایل ته یو نظر وګورو:

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

لکه څنګه چې تاسو لیدلی شئ، نه یوازې د مهاجرت د پیل کولو طریقه په اوتومات ډول رامینځته شوې، بلکه د هغې د بیرته راګرځولو طریقه هم. په زړه پورې!
ټول هغه څه چې پاتې دي د دې مهاجرت پلي کول دي. دا د لاندې کمانډ سره ترسره کیږي:

npm run migration:run.

دا دی، اوس د سکیما بدلونونه ډیټابیس ته لیږدول شوي.
بیا به موږ یو خدمت رامینځته کړو چې د کاروونکو سره د کار کولو مسؤلیت به ولري او له هغې څخه به په میراث کې وي TypeOrmCrudService. د ګټو د ادارې ذخیره باید د اصلي جوړونکي پیرامیټر ته انتقال شي، زموږ په قضیه کې User ذخیره

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

موږ به په کنټرولر کې دې خدمت ته اړتیا ولرو users. د کنټرولر جوړولو لپاره، په کنسول کې ټایپ کړئ nest g controller users/controllers/users

د نیسټ جی کنټرولر کارونکي/کنټرولر/کاروونکي

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

راځئ چې دا کنټرولر خلاص کړو او یو څه جادو اضافه کولو لپاره یې ترمیم کړو نسټjsx/crud. په ټولګي کې UsersController راځئ چې د دې په څیر یو سینګار اضافه کړو:

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

کرډ یو سینګارونکی دی چې کنټرولر ته د ماډل سره کار کولو لپاره اړین میتودونه اضافه کوي. د ماډل ډول په ساحه کې ښودل شوی model.type د سینګار تنظیمات.
دوهم ګام د انٹرفیس پلي کول دي CrudController<User>. د "راټول شوي" کنټرولر کوډ داسې ښکاري:

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

او دا ټول دي! اوس کنټرولر د ماډل سره د عملیاتو بشپړ سیټ ملاتړ کوي! په ما باور نه راځي؟ راځئ چې زموږ غوښتنلیک په عمل کې هڅه وکړو!

په TestMace کې د پوښتنې سکریپټ رامینځته کول

زموږ د خدماتو ازموینې لپاره موږ به د API سره کار کولو لپاره IDE وکاروو TestMace. ولې TestMace؟ د ورته محصولاتو په پرتله، دا لاندې ګټې لري:

  • د متغیرونو سره پیاوړی کار. په اوس وخت کې، د متغیرونو ډیری ډولونه شتون لري، چې هر یو یې یو ځانګړی رول لوبوي: جوړ شوي متغیرات، متحرک تغیرات، د چاپیریال متغیرونه. هر متغیر د نوډ پورې اړه لري چې د میراث میکانیزم ملاتړ کوي؛
  • په اسانۍ سره د پروګرام کولو پرته سکریپټونه جوړ کړئ. دا به لاندې بحث وشي؛
  • د انسان د لوستلو وړ بڼه چې تاسو ته اجازه درکوي پروژه د نسخې کنټرول سیسټمونو کې خوندي کړئ؛
  • اتوماتیک تکمیل، د نحو روښانه کول، د متغیر ارزښت روښانه کول؛
  • د API توضیح ملاتړ د سویګر څخه واردولو وړتیا سره.

راځئ چې خپل سرور د کمانډ سره پیل کړو npm start او د کاروونکو لیست ته د لاسرسي هڅه وکړئ. د کاروونکو لیست، زموږ د کنټرولر ترتیب لخوا قضاوت کول، د url localhost: 3000/users څخه ترلاسه کیدی شي. راځئ چې دې یو آر ایل ته غوښتنه وکړو.
د TestMace چلولو وروسته تاسو کولی شئ د دې په څیر یو انٹرفیس وګورئ:

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

په پورتنۍ ښي خوا کې د پروژې ونې د ریښی نوډ سره دی د پروژې د. راځئ هڅه وکړو چې د کاروونکو لیست ترلاسه کولو لپاره لومړۍ غوښتنه جوړه کړو. د دې لپاره موږ به جوړ کړو RequestStep نوډ دا د پروژې نوډ په شرایطو مینو کې ترسره کیږي نوډ اضافه کړئ -> RequestStep.

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

د URL په ساحه کې، لوکل هسټ: 3000 / کاروونکي پیسټ کړئ او غوښتنه یې پرمخ وړئ. موږ به د ځواب په بدن کې د خالي صف سره کوډ 200 ترلاسه کړو. دا د پوهیدو وړ ده، موږ تر اوسه هیڅوک نه دي شامل کړي.
راځئ چې یو سکریپټ جوړ کړو چې لاندې مرحلې به پکې شامل وي:

  1. د کاروونکي جوړول؛
  2. د نوي جوړ شوي کارونکي د ID لپاره غوښتنه؛
  3. په لومړي ګام کې رامینځته شوي د کارونکي ID لخوا حذف کول.

نو، راځئ چې لاړ شو. د اسانتیا لپاره، راځئ چې یو نوډ جوړ کړو دادوسیه. په لازمي ډول، دا یوازې یو فولډر دی چې موږ به یې ټول سکریپټ خوندي کړو. د فولډر نوډ رامینځته کولو لپاره ، د نوډ د شرایطو مینو څخه پروژه غوره کړئ نوډ اضافه کړئ -> فولډر. راځئ چې نوډ غږ کړو چیک جوړ کړئ. د نوډ دننه چیک جوړ کړئ راځئ چې د کاروونکي د جوړولو لپاره زموږ لومړۍ غوښتنه جوړه کړو. راځئ چې نوي جوړ شوي نوډ ته زنګ ووهو جوړونکی کارن. دا دی، په اوس وخت کې د نوډ درجه بندي به داسې ښکاري:

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

راځئ چې خلاص ټب ته لاړ شو جوړونکی کارن نوډ راځئ چې د غوښتنې لپاره لاندې پیرامیټونه دننه کړو:

  • د غوښتنې ډول - POST
  • URL - localhost: 3000 / کاروونکي
  • بدن - د ارزښت سره JSON {"email": "[email protected]", "displayName": "New user", "username": "user"}

راځئ چې دا غوښتنه پوره کړو. زموږ غوښتنلیک وايي چې ریکارډ جوړ شوی.

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

ښه، راځئ چې دا حقیقت وګورو. په راتلونکو مرحلو کې د رامینځته شوي کارونکي id سره کار کولو لپاره ، دا پیرامیټر باید خوندي شي. میکانیزم د دې لپاره مناسب دی. متحرک تغیرات. راځئ چې زموږ مثال وکاروو ترڅو وګورو چې څنګه ورسره کار وکړو. د ځواب په پارس شوي ټب کې ، د شرایطو مینو کې د ID نوډ سره څنګ ته ، توکي غوره کړئ متغیر ته وټاکئ. د ډیالوګ بکس کې تاسو باید لاندې پیرامیټونه تنظیم کړئ:

  • نوډ - په کوم یو کې د یو متحرک متغیر رامینځته کول. راځئ چې غوره کړو چیک جوړ کړئ
  • متغیر نوم - د دې متغیر نوم. راځئ چې غږ وکړو userId.

دلته هغه څه دي چې د متحرک متغیر رامینځته کولو پروسه داسې ښکاري:

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

اوس، هرکله چې دا پوښتنه اجرا کیږي، د متحرک متغیر ارزښت به تازه شي. او ځکه متحرک متغیرونه د درجه بندي میراث میکانیزم ملاتړ کوي، متغیر userId په اولادونو کې به موجود وي چیک جوړ کړئ د هر ډول ځالې کچې نوډ.
دا متغیر به په راتلونکې غوښتنه کې زموږ لپاره ګټور وي. د بیلګې په توګه، موږ به د نوي جوړ شوي کاروونکي غوښتنه وکړو. د نوډ د ماشوم په توګه چیک جوړ کړئ موږ به یوه غوښتنه جوړه کړو وګورئ که شتون ولري د پیرامیټر سره url مساوي localhost:3000/users/${$dynamicVar.userId}. ډیزاین وګورئ ${variable_name} دا د متغیر ارزښت ترلاسه کوي. ځکه موږ یو متحرک متغیر لرو، نو د دې ترلاسه کولو لپاره تاسو اړتیا لرئ اعتراض ته لاسرسی ومومئ $dynamicVar، د بیلګې په توګه په بشپړ ډول متحرک متغیر ته لاسرسی userId به داسې ښکاري ${$dynamicVar.userId}. راځئ چې غوښتنه اجرا کړو او ډاډ ترلاسه کړو چې ډاټا په سمه توګه غوښتنه شوې.
وروستی ګام پاتې دی چې د حذف کولو غوښتنه وکړي. موږ دې ته اړتیا لرو چې نه یوازې د حذف کولو عملیات وګورو ، بلکه په ډیټابیس کې خپل ځان پاکولو ته هم اړتیا لرو ، ځکه چې د بریښنالیک او کارن نوم ساحې ځانګړي دي. نو، د چک جوړونکي نوډ کې به موږ د لاندې پیرامیټونو سره د حذف کولو کارونکي غوښتنه جوړه کړو

  • د غوښتنې ډول - ړنګول
  • URL - localhost:3000/users/${$dynamicVar.userId}

راځئ چې پیل کړو. موږ انتظار کوو. موږ د پایلې څخه خوند اخلو)

ښه، اوس موږ کولی شو دا ټول سکریپټ په هر وخت کې پرمخ یوسو. د سکریپټ چلولو لپاره تاسو اړتیا لرئ د شرایطو مینو څخه غوره کړئ چیک جوړ کړئ نوډ توکي د دويم.

د نیسټ، @nestjsx/crud او TestMace سره ګړندي CRUD جوړول

په سکریپټ کې نوډونه به یو له بل وروسته اجرا شي
تاسو کولی شئ دا سکریپټ په چلولو سره خپلې پروژې ته خوندي کړئ فایل -> پروژه خوندي کړئ.

پایلې

د کارول شویو وسایلو ټولې ځانګړتیاوې په ساده ډول د دې مقالې بڼه کې نه شي کولی. لکه څنګه چې د اصلي مجرم لپاره - کڅوړه نسټjsx/crud - لاندې موضوعات پټ پاتې دي:

  • دودیز تایید او د ماډلونو بدلون؛
  • د پوښتنې ځواکمنه ژبه او په مخ کې د هغې مناسب کارول؛
  • د کرډ کنټرولرانو ته د نوي میتودونو بیا تعریف او اضافه کول؛
  • د غولولو ملاتړ؛
  • د کیشینګ مدیریت.

په هرصورت، حتی هغه څه چې په مقاله کې تشریح شوي د پوهیدو لپاره کافي دي چې حتی د NestJS په څیر د داسې تصدۍ چوکاټ د ګړندي غوښتنلیک پروټوټایپینګ لپاره وسیلې لري. او داسې یو ښه IDE لکه TestMace تاسو ته اجازه درکوي چې یو ټاکلی سرعت وساتي.

د دې مقالې لپاره د سرچینې کوډ، د پروژې سره TestMaceپه ذخیره کې شتون لري https://github.com/TestMace/nest-rest. د پروژې پرانیستلو لپاره TestMace یوازې دا په اپلیکیشن کې وکړئ فایل -> پروژه خلاص کړئ.

سرچینه: www.habr.com

Add a comment