Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Hona joale, REST API e fetohile mokhoa oa ho ntlafatsa ts'ebeliso ea websaete, e lumellang tsoelo-pele ho aroloa likarolo tse ikemetseng. Merero e fapaneng e tsebahalang joalo ka Angular, React, Vue le tse ling hajoale e sebelisoa bakeng sa UI. Bahlahisi ba backend ba ka khetha lipuong le meralo e fapaneng. Kajeno ke rata ho bua ka moralo o joalo ka SehlahaJS. Re kene TestMace Re e sebelisa ka mafolofolo bakeng sa merero ea ka hare. Ho sebelisa sehlaha le sephutheloana @nestjsx/crud, re tla etsa kopo e bonolo ea CRUD.

Hobaneng NestJS

Haufinyane tjena, meralo e mengata ea backend e hlahile sechabeng sa JavaScript. 'Me haeba ho latela ts'ebetso ba fana ka bokhoni bo ts'oanang ho Nest, joale ka ntho e le' ngoe e ea hlōla - ena ke mohaho oa meralo. Lintlha tse latelang tsa NestJS li u lumella ho theha lits'ebetso tsa indasteri le nts'etsopele ea lihlopha tse kholo:

  • ho sebelisa TypeScript joalo ka puo ea mantlha ea ntlafatso. Leha NestJS e ts'ehetsa JavaScript, ts'ebetso e 'ngoe e kanna ea se sebetse, haholo haeba re bua ka liphutheloana tsa mokha oa boraro;
  • boteng ba setshelo sa DI, se u lumellang hore u thehe likarolo tse kopantsoeng ka mokhoa o hlephileng;
  • Ts'ebetso ea moralo ka boeona e arotsoe ka likarolo tse ikemetseng tse feto-fetohang. Ka mohlala, tlas'a hood e le moralo o ka sebelisoa e le bontšele fastify, ho sebetsa le polokelongtshedimosetso, sehlaha ka ntle ho lebokose e fana ka ditlamo ho mofuta oa typorm, mongoose, sequelize;
  • NestJS ke sethala sa agnostic 'me se tšehetsa REST, GraphQL, Websockets, gRPC, joalo-joalo.

Moralo ka boeona o bululetsoe ke moralo oa Angular frontend mme ka mohopolo o na le lintho tse ngata tse tšoanang le eona.

Ho kenya NestJS le ho Deploying Project

Nest e na le sephutheloana sehlaha/cli, e u lumellang hore u potlakele ho tsamaisa moralo oa ts'ebeliso ea mantlha. Ha re kenye sephutheloana sena lefatšeng ka bophara:

npm install --global @nest/cli

Kamora ho kenya, re tla hlahisa moralo oa mantlha oa kopo ea rona ka lebitso Nest-rest. Sena se etsoa ho sebelisoa taelo nest new nest-rest.

sehlaha se secha-sehlaha

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

Re tla khetha khoele e le mookameli oa sephutheloana sa rona.
Ka nako ena o ka qala seva ka taelo npm start le ho ea atereseng http://localhost:3000 u ka bona leqephe la sehlooho. Leha ho le joalo, ha se lebaka leo re bokaneng mona mme re ntse re tsoela pele.

Ho theha mosebetsi le database

Ke khethile PostrgreSQL joalo ka DBMS ea sengoloa sena. Ha ho na phehisano mabapi le litakatso; ka maikutlo a ka, ena ke DBMS e hōlileng ka ho fetisisa, e nang le bokhoni bohle bo hlokahalang. Joalo ka ha ho se ho boletsoe, Nest e fana ka kopanyo le liphutheloana tse fapaneng ho sebetsa le database. Hobane Kaha khetho ea ka e oele ho PostgreSQL, e ka ba ho utloahalang ho khetha TypeORM joalo ka ORM. Ha re kenye liphutheloana tse hlokahalang bakeng sa ho kopanngoa le database:

yarn add typeorm @nestjs/typeorm pg

Ka tatellano, sephutheloana se seng le se seng se hlokahala bakeng sa:

  1. typeorm - sephutheloana ka kotloloho ho tsoa ho ORM ka boeona;
  2. @nestjs/typeorm - Sephutheloana sa TypeORM sa NestJS. E eketsa li-module bakeng sa ho kenya li-module tsa morero, hammoho le sehlopha sa bakhabi ba bathusi;
  3. pg - mokhanni oa ho sebetsa le PostgreSQL.

Ho lokile, liphutheloana li kentsoe, joale o hloka ho qala database ka boeona. Ho tsamaisa database, ke tla sebelisa docker-compose.yml ka litaba tse latelang:

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

Joalokaha u bona, faele ena e hlophisa ho hlahisoa ha lijana tse 2:

  1. db ke setshelo se nang le database ka kotloloho. Tabeng ea rona, postgresql version 11.2 e sebelisoa;
  2. molaoli - mookameli oa database. E fana ka segokanyimmediamentsi sa sebolokigolo bakeng sa ho boha le ho laola database.

Ho sebetsa le likhokahano tsa tcp, ke kentse tlhophiso e latelang.

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

Ke tsohle, o ka qala lijana ka taelo docker-compose up -d. Kapa ho console e arohaneng le taelo docker-compose up.

Kahoo, liphutheloana li kentsoe, database e se e qalile, ho setseng ke ho etsa metsoalle. Ho etsa sena, o hloka ho kenyelletsa faele e latelang motsong oa projeke: 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"
}
}

Tlhophiso ena e tla sebelisoa bakeng sa cli typeorm.

Ha re shebeng tlhophiso ena ka botlalo. Meleng ea 3 le ea 4 re fumana lebitso la mosebelisi le password ho tsoa mefuteng ea tikoloho. Sena se bonolo ha o na le libaka tse 'maloa (dev, sethala, prod, joalo-joalo). Ka mokhoa o ikhethileng, lebitso la mosebelisi ke li-postgres mme password ke mohlala. Tse ling kaofela tsa config ha li nyane, kahoo re tla shebana feela le liparamente tse khahlisang haholo:

  • synchronize - E bonts'a hore na schema ea database e lokela ho etsoa ka bo eona ha ts'ebeliso e qala. E-ba hlokolosi ka khetho ena 'me u se ke ua e sebelisa tlhahiso, ho seng joalo u tla lahleheloa ke data. Khetho ena e bonolo ha o theha le ho lokisa sesebelisoa. E le mokhoa o mong oa khetho ena, u ka sebelisa taelo schema:sync ho tsoa ho CLI TypeORM.
  • dropSchema - seta schema nako le nako ha khokahano e thehoa. Joalo ka e fetileng, khetho ena e lokela ho sebelisoa feela nakong ea nts'etsopele le ts'ebetso ea ts'ebetso.
  • mekhatlo - e leng litsela tsa ho batla litlhaloso tsa mehlala. Ka kopo hlokomela hore ho batla ka mask hoa tšehetsoa.
  • cli.entitiesDir ke buka eo ho eona mefuta e entsoeng ho tsoa ho TypeORM CLI e lokelang ho bolokoa ka ho sa feleng.

E le hore re tsebe ho sebelisa likarolo tsohle tsa TypeORM ts'ebelisong ea rona ea Nest, re hloka ho kenya mojule. TypeOrmModule в AppModule. Tseo. hao AppModule e tla shebahala tjena:

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

Joalokaha u ka be u hlokometse, mokhoa forRoot tlhophiso e tšoanang ea ho sebetsa le database e fetisoa joalo ka faeleng ea ormconfig.ts

Taba ea ho qetela e sala - eketsa mesebetsi e mengata ea ho sebetsa le TypeORM ho package.json. Taba ke hore CLI e ngotsoe ka javascript mme e sebetsa tikolohong ea nodejs. Leha ho le joalo, mehlala eohle ea rona le ho falla ho tla ngoloa ka mongolo oa mongolo. Ka hona, hoa hlokahala ho fetolela ho falla le mehlala ea rona pele re sebelisa CLI. Bakeng sa sena re hloka sephutheloana sa ts-node:

yarn add -D ts-node

Kamora moo, eketsa litaelo tse hlokahalang ho 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"

Taelo ea pele, typeorm, e eketsa ts-node wrapper ho tsamaisa TypeORM cli. Litaelo tse setseng ke likhutšoane tse bonolo tseo uena, joalo ka moqapi, u tla li sebelisa hoo e ka bang letsatsi le leng le le leng:
migration:generate — ho theha metsamao e ipapisitseng le liphetoho tse teng mefuteng ea hau.
migration:create — ho theha phallo e se nang letho.
migration:run - ho qala ho falla.
Ho joalo, ke hona joale, re kentse liphutheloana tse hlokahalang, re lokiselitse kopo ho sebetsa le database ka bobeli ho tloha ho cli le ho tloha ho kopo ka boeona, hape re hlahisitse DBMS. Ke nako ea ho kenya logic ts'ebelisong ea rona.

Ho kenya liphutheloana tsa ho theha CRUD

U sebelisa Nest feela, u ka etsa API e u lumellang ho etsa, ho bala, ho ntlafatsa le ho hlakola setheo. Tharollo ena e tla feto-fetoha ka hohle kamoo ho ka khonehang, empa maemong a mang e tla ba e sa hlokahaleng. Ka mohlala, haeba u hloka ho etsa prototype ka potlako, hangata u ka itela ho fetoha ha maemo bakeng sa lebelo la tsoelo-pele. Mekhahlelo e mengata e fana ka ts'ebetso ea ho hlahisa CRUD ka ho hlalosa mohlala oa data oa setheo se itseng. Le Nest le eona e joalo! Ts'ebetso ena e fanoa ke sephutheloana @nestjsx/crud. Bokhoni ba eona bo khahla haholo:

  • ho kenya habonolo le ho hlophisoa;
  • boikemelo ba DBMS;
  • puo e matla ea ho botsa e nang le bokhoni ba ho sefa, ho etsa bohetene, ho hlophisa, ho beha likamano le mekhatlo e hlophisitsoeng, caching, joalo-joalo;
  • sephutheloana sa ho hlahisa likopo ka pele-pele;
  • ho fetisoa ho bonolo ha mekhoa ea taolo;
  • config e nyane;
  • tšehetso ea litokomane tsa swagger.

Tshebetso e arotsoe ka liphutheloana tse 'maloa:

  • @nestjsx/crud - sephutheloana sa motheo seo mokhabiso a fanang ka sona Crud() bakeng sa tlhahiso ea litsela, tlhophiso le netefatso;
  • @nestjsx/crud-request - sephutheloana se fanang ka sehahi sa lipotso bakeng sa ho sebelisoa ka lehlakoreng le ka pele;
  • @nestjsx/crud-typeorm - sephutheloana sa ho hokahana le TypeORM, se fanang ka ts'ebeletso ea mantlha ea TypeOrmCrudService ka mekhoa ea CRUD ea ho sebetsa le mekhatlo e polokelong ea litaba.

Thutong ena re tla hloka liphutheloana sehlahajsx/crud le sehlahajsx/crud-typeorm. Pele, a re li beheng

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

Lipapaka sehlopha-transformer и moemedi wa sehlopha ka kopo ena ho hlokahala bakeng sa tlhaloso declarative ea melao bakeng sa ho fetola mehlala ea mohlala le ho netefatsa likopo tse kenang, ka ho latellana. Liphutheloana tsena li tsoa ho sengoli se le seng, kahoo li-interfaces li tšoana.

Ts'ebetsong e tobileng ea CRUD

Re tla nka lethathamo la basebelisi e le mohlala oa mohlala. Basebelisi ba tla ba le likarolo tse latelang: id, username, displayName, email. id - lebaleng la ho eketsa boiketsetso, email и username - masimo a ikhethang. Ho bonolo! Ho setseng ke ho kenya tšebetsong mohopolo oa rona ka mokhoa oa ho sebelisa Nest.
Pele u lokela ho etsa module users, ea tla ikarabella bakeng sa ho sebetsa le basebelisi. Ha re sebeliseng cli ho tloha NestJS 'me re phethe taelo bukeng ea motso oa projeke ea rona nest g module users.

basebelisi ba sehlaha sa g

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)

Mojulung ona re tla eketsa foldara ea mekhatlo, moo re tla ba le mehlala ea mojule ona. Haholo-holo, ha re kenyeng mona file user.entity.ts ka tlhaloso ea mofuta oa mosebelisi:

mosebedisi.setheo.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;
}

E le hore mohlala ona o "bonoe" ke ts'ebeliso ea rona, hoa hlokahala mojulung UsersModule kenya TypeOrmModule litaba tse latelang:

basebelisi.mojule.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 {}

Ke hore, mona re import TypeOrmModule, moo e le mokhoa parameter forFeature Re bontša lenane la mehlala e amanang le mojule ona.

Sohle se setseng ke ho theha setheo se ts'oanang ho database. Mokhoa oa ho falla o sebeletsa merero ena. Ho theha phallo e thehiloeng ho liphetoho tsa mehlala, o hloka ho tsamaisa taelo npm run migration:generate -- CreateUserTable:

sehlooho se senyang

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

Re ne re sa tlameha ho ngola phalliso ka letsoho, tsohle li etsahetse ka boselamose. Na see ha se mohlolo! Leha ho le joalo, ha se eona feela. Ha re shebeng faele ea ho falla e entsoeng:

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

Joalokaha u ka bona, ha se feela mokhoa oa ho qala ho falla o hlahisitsoeng ka bo eona, empa hape le mokhoa oa ho o khutlisa. E monate!
Se se setseng ke ho qala phallo ena. Sena se etsoa ka taelo e latelang:

npm run migration:run.

Ke eona, joale liphetoho tsa schema li falletse ho database.
Ka mor'a moo, re tla theha tšebeletso e tla ba le boikarabelo ba ho sebetsa le basebelisi le ho rua lefa ho eona TypeOrmCrudService. Sebaka sa polokelo ea lintho tse khahlang se tlameha ho fetisetsoa paramenteng ea moetsi oa motsoali, molemong oa rona. User polokelo.

basebelisi.tšebeletso.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);
}
}

Re tla hloka tšebeletso ena ho molaoli users. Ho theha molaoli, thaepa ho console nest g controller users/controllers/users

nest g controller basebelisi/balaoli/basebelisi

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)

Ha re bule selaoli sena 'me re se hlophise ho eketsa boloi bo bonyenyane sehlahajsx/crud. Ka sehlopha UsersController Ha re kenye mokhabiso o kang ona:

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

Crud ke mokhabiso ea eketsang molaoli mekhoa e hlokahalang ea ho sebetsa le mohlala. Mofuta oa mohlala o bontšitsoe tšimong model.type litlhophiso tsa mokhabiso.
Mohato oa bobeli ke ho kenya tshebetsong segokanyimmediamentsi sa sebolokigolo CrudController<User>. Khoutu ea taolo e "kopaneng" e shebahala tjena:

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

'Me ho tsohle! Hona joale molaoli o tšehetsa sehlopha sohle sa ts'ebetso ka mohlala! Ha le ntumele? Ha re lekeng kopo ea rona e sebetsa!

Ho theha Sengoloa sa Potso ho TestMace

Ho leka ts'ebeletso ea rona re tla sebelisa IDE ho sebetsa le API TestMace. Hobaneng TestMace? Ha e bapisoa le lihlahisoa tse tšoanang, e na le melemo e latelang:

  • mosebetsi o matla o nang le mefuta e fapaneng. Hona joale, ho na le mefuta e mengata ea mefuta-futa, e 'ngoe le e' ngoe e phetha karolo e itseng: mefuta-futa e hahiloeng, e matla, e fapaneng ea tikoloho. E 'ngoe le e' ngoe e fapaneng ke ea node e nang le ts'ehetso ea mochine oa lefa;
  • Etsa mangolo habonolo ntle le ho etsa mananeo. Sena se tla tšohloa ka tlase;
  • sebopeho se baloang ke motho se u lumellang ho boloka morero ho litsamaiso tsa taolo ea mofuta;
  • ho phethela ka ho iketsa, ho hlakisa mantsoe, ho totobatsa boleng bo fapaneng;
  • Ts'ehetso ea tlhaloso ea API ka bokhoni ba ho reka kantle ho Swagger.

Ha re qale seva sa rona ka taelo npm start 'me u leke ho fumana lenane la basebelisi. Lenane la basebelisi, ho latela tlhophiso ea molaoli oa rona, le ka fumanoa ho url localhost:3000/users. Ha re etseng kopo ho url ena.
Kamora ho matha TestMace u ka bona sebopeho se kang sena:

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Ka holimo ka ho le letšehali ke sefate sa morero se nang le node ea motso Morero. Ha re leke ho etsa kopo ea pele ea ho fumana lenane la basebelisi. Bakeng sa sena re tla bopa KopaMohato node Sena se etsoa ka har'a menu ea moelelo oa "Project node". Kenya node -> RequestStep.

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Lebaleng la URL, beha sebaka sa lehae: 3000 / basebelisi 'me u tsamaise kopo. Re tla amohela khoutu ea 200 ka lethathamo le se nang letho 'meleng oa karabelo. Hoa utloahala, ha re e-so kenye motho leha e le ofe.
Ha re theheng mongolo o tla kenyelletsa mehato e latelang:

  1. ho theha mosebedisi;
  2. kopo ea ID ea mosebelisi e mocha;
  3. ho hlakola ka id ea mosebelisi e entsoeng mohatong oa 1.

Kahoo, ha re yeng. Bakeng sa boiketlo, a re theheng node e kang ba foldara. Ha e le hantle, ena ke foldara feela eo ho eona re tla boloka script kaofela. Ho theha node ea Folder, khetha Project ho tsoa ho menu ea moelelo oa node Kenya node -> Folder. Ha re bitse node hlahloba-bopa. Ka hare ho node hlahloba-bopa Ha re etseng kopo ea rona ea pele ea ho theha mosebelisi. Ha re bitse node e ncha e entsoeng bopa-mosebedisi. Ka mantsoe a mang, hona joale boemo ba li-node bo tla shebahala tjena:

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Ha re ee ho tab e butsoeng bopa-mosebedisi node. Ha re kenye liparamente tse latelang bakeng sa kopo:

  • Mofuta oa kopo - POST
  • URL - localhost:3000/users
  • 'Mele - JSON ka boleng {"email": "[email protected]", "displayName": "New user", "username": "user"}

Ha re phethahatseng kopo ena. Kopo ea rona e re rekoto e entsoe.

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Ho lokile, ha re hlahlobeng taba ena. E le hore u sebetse ka id ea mosebedisi ea bōpiloeng mehatong e latelang, parameter ena e tlameha ho bolokoa. Mochine o phethahetse bakeng sa sena. mefuta e fapaneng. Ha re sebeliseng mohlala oa rona ho sheba mokhoa oa ho sebetsa le bona. Ho tab e arotsoeng ea karabo, haufi le node ea id ho menu ea moelelo, khetha ntho eo Abela ho feto-fetoha. Ka lebokoseng la puisano u tlameha ho beha li-parameter tse latelang:

  • noute - eo ho eona ea baholo-holo ho theha phetoho e matla. Ha re khetheng hlahloba-bopa
  • Lebitso le fetolehang - lebitso la phetoho ena. Ha re letse userId.

Mona ke hore na ts'ebetso ea ho theha phetoho e matla e shebahala joang:

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Joale, nako le nako ha potso ena e etsoa, ​​​​boleng ba phetoho e matla bo tla ntlafatsoa. Mme hobane mefuta-futa e matla e tšehetsa mochine oa lefa la hierarchical, feto-fetoha userId e tla fumaneha ka litloholo hlahloba-bopa node ea boemo bofe kapa bofe ba sehlaha.
Phetoho ena e tla ba molemo ho rona kopong e latelang. E leng, re tla kopa mosebelisi ea sa tsoa etsoa. Joalo ka ngoana oa node hlahloba-bopa re tla etsa kopo hlahloba-haeba e teng e nang le parameter url lekana localhost:3000/users/${$dynamicVar.userId}. Sheba moralo ${variable_name} sena ke ho fumana boleng ba phetoho. Hobane Re na le phetoho e matla, kahoo ho e fumana o hloka ho fihlella ntho $dynamicVar, ke hore ho fihlella ka ho feletseng phetoho e matla userId e tla shebahala tjena ${$dynamicVar.userId}. Ha re etseng kopo mme re netefatse hore data e kopuoa ka nepo.
Mohato oa ho qetela o setseng ke ho kopa ho hlakoloa. Ha re e hloke feela hore re hlahlobe ts'ebetso ea ho hlakoloa, empa hape, ka mantsoe a mang, ho itlhoekisa ka har'a database, hobane Libaka tsa lengolo-tsoibila le lebitso la mosebelisi li ikhethile. Kahoo, sebakeng sa "check-create node" re tla theha kopo ea ho hlakola-mosebelisi ka li-parameter tse latelang

  • Mofuta oa kopo - DELETE
  • url - localhost:3000/users/${$dynamicVar.userId}

Ha re qaleng. Re leta. Re thabela sephetho)

Joale, re ka tsamaisa mongolo ona ka nako efe kapa efe. Ho tsamaisa script o hloka ho khetha ho tsoa ho menyu ea litaba hlahloba-bopa ntho ea node Matha.

Pōpo e potlakileng ea CRUD e nang le sehlaha, @nestjsx/crud le TestMace

Li-node tsa script li tla etsoa ka ho latellana
U ka boloka mongolo ona morerong oa hau ka ho matha Faele -> Boloka morero.

fihlela qeto e

Likarolo tsohle tsa lisebelisoa tse sebelisitsoeng li ne li ke ke tsa lumellana le sebopeho sa sengoloa sena. Ha e le motlōli ea ka sehloohong - sephutheloana sehlahajsx/crud - lihlooho tse latelang li lula li sa koaheloa:

  • netefatso ea moetlo le phetoho ea mehlala;
  • puo e matla ea ho botsa le tšebeliso ea eona e bonolo ka pele;
  • ho hlalosa bocha le ho eketsa mekhoa e mecha ho balaoli ba crud;
  • tšehetso ea swagger;
  • tsamaiso ea caching.

Leha ho le joalo, le se hlalositsoeng sengoloa se lekane ho utloisisa hore le moralo oa khoebo o joalo ka NestJS o na le lisebelisoa tsa ho etsa prototyping ea kopo e potlakileng. Le IDE e pholileng joalo joalo TestMace e o lumella ho boloka lebelo le fanoeng.

Mohloli oa sengoloa sena, hammoho le morero TestMace, e fumanehang sebakeng sa polokelo https://github.com/TestMace/nest-rest. Ho bula morero TestMace etsa feela ka app Faele -> Bula morero.

Source: www.habr.com

Eketsa ka tlhaloso