Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Tam sim no, REST API tau dhau los ua tus qauv rau kev txhim kho lub vev xaib, tso cai rau kev txhim kho tau muab faib ua qhov ywj pheej. Ntau cov qauv nrov xws li Angular, React, Vue thiab lwm yam tam sim no siv rau UI. Cov neeg tsim tawm Backend tuaj yeem xaiv los ntawm ntau hom lus thiab cov txheej txheem. Hnub no kuv xav tham txog lub moj khaum li no NestJS. Peb nyob hauv TestMace Peb nquag siv nws rau cov haujlwm sab hauv. Siv zes thiab pob @nestjsx/crud, peb yuav tsim ib daim ntawv thov CRUD yooj yim.

Vim li cas NestJS

Tsis ntev los no, ntau lub backend moj khaum tau tshwm sim hauv zej zog JavaScript. Thiab yog hais tias nyob rau hauv cov nqe lus ntawm functionality lawv muab zoo xws li lub peev xwm rau Nest, ces nyob rau hauv ib yam nws yeej yeej - qhov no yog lub architecture. Cov NestJS cov nta hauv qab no tso cai rau koj los tsim cov ntawv thov kev lag luam thiab kev loj hlob rau pawg loj:

  • siv TypeScript ua hom lus tseem ceeb. Txawm hais tias NestJS txhawb JavaScript, qee qhov kev ua haujlwm yuav tsis ua haujlwm, tshwj xeeb tshaj yog tias peb tab tom tham txog cov pob khoom thib peb;
  • lub xub ntiag ntawm lub thawv DI, uas tso cai rau koj los tsim cov khoom sib txuas xoob xoob;
  • Lub functionality ntawm lub moj khaum nws tus kheej yog muab faib ua ywj siab interchangeable Cheebtsam. Piv txwv li, nyob rau hauv lub hood raws li lub moj khaum nws yuav siv tau raws li qhia, thiab ceev ceev, ua hauj lwm nrog cov database, zes tawm ntawm lub thawv muab bindings rau ntaus ntawv, tus nplaig, sequelize;
  • NestJS yog platform agnostic thiab txhawb REST, GraphQL, Websockets, gRPC, thiab lwm yam.

Lub moj khaum nws tus kheej yog kev tshoov siab los ntawm Angular frontend moj khaum thiab conceptually muaj ntau yam nrog nws.

Txhim kho NestJS thiab xa tawm qhov project

Nest muaj ib pob zes/ cli, uas tso cai rau koj kom xa cov ntawv thov yooj yim. Cia peb nruab lub pob no thoob ntiaj teb:

npm install --global @nest/cli

Tom qab kev teeb tsa, peb yuav tsim cov txheej txheem yooj yim ntawm peb daim ntawv thov nrog lub npe zes-rest. Qhov no yog ua tiav siv cov lus txib nest new nest-rest.

zes tshiab zes-so

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

Peb yuav xaiv cov xov paj raws li peb tus neeg saib xyuas pob.
Ntawm no koj tuaj yeem pib lub server nrog cov lus txib npm start thiab mus rau qhov chaw nyob http://localhost:3000 koj tuaj yeem pom nplooj ntawv tseem ceeb. Txawm li cas los xij, qhov no tsis yog vim li cas peb tau sib sau ua ke ntawm no thiab peb tab tom mus.

Kev teeb tsa ua haujlwm nrog lub database

Kuv xaiv PostrgreSQL ua DBMS rau kab lus no. Tsis muaj kev tsis sib haum xeeb txog kev saj; hauv kuv lub tswv yim, qhov no yog DBMS paub tab, muaj tag nrho cov peev txheej tsim nyog. Raws li twb tau hais lawm, Nest muab kev koom ua ke nrog ntau pob khoom los ua haujlwm nrog cov ntaub ntawv. Vim Txij li thaum kuv qhov kev xaiv poob rau PostgreSQL, nws yuav yog qhov tsim nyog xaiv TypeORM ua ORM. Cia peb nruab cov pob khoom tsim nyog rau kev koom ua ke nrog cov ntaub ntawv:

yarn add typeorm @nestjs/typeorm pg

Nyob rau hauv kev txiav txim, dab tsi txhua pob yog xav tau rau:

  1. typeorm - ib pob ncaj qha los ntawm ORM nws tus kheej;
  2. @nestjs/typeorm - TypeORM pob rau NestJS. Ntxiv cov modules rau importing rau hauv qhov project modules, nrog rau ib pawg ntawm pab decorators;
  3. pg - tus tsav tsheb rau kev ua haujlwm nrog PostgreSQL.

Okay, cov pob tau teeb tsa, tam sim no koj yuav tsum tso lub database nws tus kheej. Txhawm rau xa cov ntaub ntawv, kuv yuav siv docker-compose.yml nrog cov ntsiab lus hauv qab no:

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

Raws li koj tuaj yeem pom, cov ntaub ntawv no teeb tsa lub community launch ntawm 2 ntim:

  1. db yog lub thawv ncaj qha uas muaj cov ntaub ntawv. Hauv peb cov ntaub ntawv, postgresql version 11.2 yog siv;
  2. tus thawj tswj-database manager. Muab lub web interface rau saib thiab tswj cov database.

Txhawm rau ua haujlwm nrog kev sib txuas tcp, kuv ntxiv cov teeb tsa hauv qab no.

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

Ntawd yog tag nrho, koj tuaj yeem pib ntim nrog cov lus txib docker-compose up -d. Los yog hauv ib lub console cais nrog cov lus txib docker-compose up.

Yog li, cov pob khoom tau raug teeb tsa, cov ntaub ntawv tau raug tso tawm, txhua yam uas tseem tshuav yog ua kom lawv phooj ywg nrog ib leeg. Txhawm rau ua qhov no, koj yuav tsum ntxiv cov ntaub ntawv hauv qab no rau qhov project hauv paus: 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"
}
}

Qhov kev teeb tsa no yuav raug siv rau cli typeorm.

Wb saib qhov kev teeb tsa no kom ntxaws ntxiv. Ntawm kab 3 thiab 4 peb tau txais tus username thiab password los ntawm ib puag ncig hloov pauv. Qhov no yooj yim thaum koj muaj ntau qhov chaw (dev, theem, prod, thiab lwm yam). Los ntawm lub neej ntawd, tus username yog postgres thiab tus password yog piv txwv. Tus so ntawm config yog qhov tsis tseem ceeb, yog li peb yuav tsom mus rau qhov nthuav dav tshaj plaws:

  • synchronize - Qhia seb lub database schema yuav tsum tau tsim thaum daim ntawv thov pib. Ceev faj nrog qhov kev xaiv no thiab tsis txhob siv nws hauv kev tsim khoom, txwv tsis pub koj yuav poob cov ntaub ntawv. Qhov kev xaiv no yooj yim thaum tsim thiab debugging ib daim ntawv thov. Raws li lwm txoj hauv kev rau qhov kev xaiv no, koj tuaj yeem siv cov lus txib schema:sync los ntawm CLI TypeORM.
  • dropSchema - rov pib dua lub schema txhua zaus tsim kev sib txuas. Ib yam li yav dhau los, qhov kev xaiv no yuav tsum tau siv tsuas yog thaum lub sijhawm txhim kho thiab kev debugging ntawm daim ntawv thov.
  • cov koom haum - uas txoj kev mus nrhiav kev piav qhia ntawm cov qauv. Thov nco ntsoov tias kev tshawb nrhiav los ntawm daim npog ntsej muag tau txais kev txhawb nqa.
  • cli.entitiesDir yog daim ntawv teev npe uas cov qauv tsim los ntawm TypeORM CLI yuav tsum khaws cia los ntawm lub neej ntawd.

Txhawm rau kom peb tuaj yeem siv tag nrho cov yam ntxwv ntawm TypeORM hauv peb daim ntawv thov Nest, peb yuav tsum tau import cov module. TypeOrmModule Π² AppModule. Cov. koj AppModule yuav zoo li no:

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

Raws li koj tau pom, txoj kev forRoot tib configuration rau kev ua hauj lwm nrog cov database yog pauv raws li nyob rau hauv cov ntaub ntawv ormconfig.ts

Qhov kawg kov tseem nyob - ntxiv ntau txoj haujlwm rau kev ua haujlwm nrog TypeORM hauv package.json. Qhov tseeb yog tias CLI tau sau rau hauv javascript thiab khiav hauv nodejs ib puag ncig. Txawm li cas los xij, tag nrho peb cov qauv thiab kev tsiv teb tsaws chaw yuav raug sau ua ntawv sau. Yog li ntawd, nws yog ib qho tsim nyog los hloov peb cov kev tsiv teb tsaws chaw thiab cov qauv ua ntej siv CLI. Rau qhov no peb xav tau ts-node pob:

yarn add -D ts-node

Tom qab ntawd, ntxiv cov lus txib tsim nyog rau 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"

Thawj qhov hais kom ua, ntaus ntawv, ntxiv ts-node wrapper los khiav TypeORM cli. Cov lus txib ntxiv yog cov shortcuts yooj yim uas koj, raws li tus tsim tawm, yuav siv yuav luag txhua hnub:
migration:generate - tsim kev tsiv teb tsaws chaw raws li kev hloov pauv hauv koj cov qauv.
migration:create - tsim kom muaj kev tsiv teb tsaws chaw.
migration:run - pib tsiv teb tsaws chaw.
Zoo, qhov ntawd yog nws tam sim no, peb tau ntxiv cov pob tsim nyog, teeb tsa daim ntawv thov ua haujlwm nrog cov ntaub ntawv ob qho tib si los ntawm cli thiab los ntawm daim ntawv thov nws tus kheej, thiab tseem tso tawm DBMS. Nws yog lub sij hawm ntxiv logic rau peb daim ntawv thov.

Txhim kho pob khoom tsim CRUD

Siv Nest nkaus xwb, koj tuaj yeem tsim ib qho API uas tso cai rau koj los tsim, nyeem, hloov kho, thiab tshem tawm ib qho chaw. Qhov kev daws teeb meem no yuav hloov tau raws li qhov ua tau, tab sis qee zaum nws yuav rov ua dua. Piv txwv li, yog tias koj xav tau sai sai tsim ib tus qauv, koj tuaj yeem feem ntau txi kev yooj yim rau kev loj hlob sai. Ntau lub moj khaum muab kev ua haujlwm rau kev tsim CRUD los ntawm kev piav qhia cov qauv ntaub ntawv ntawm qee qhov chaw. Thiab Nest tsis muaj qhov zam! Qhov no functionality yog muab los ntawm lub pob @nestjsx/crud. Nws lub peev xwm yog qhov nthuav heev:

  • yooj yim installation thiab configuration;
  • DBMS kev ywj pheej;
  • cov lus nug muaj zog nrog lub peev xwm lim, paginate, txheeb, thauj cov kev sib raug zoo thiab cov chaw zes, caching, thiab lwm yam;
  • pob rau tsim kev thov nyob rau pem hauv ntej-kawg;
  • yooj yim overriding ntawm xws li txoj kev;
  • me me config;
  • swagger cov ntaub ntawv txhawb nqa.

Lub functionality muab faib ua ob peb pob:

  • @nestjsx/crud - Cov pob yooj yim uas tus dai kom zoo nkauj muab Crud() rau kev tsim, kev teeb tsa thiab kev siv tau;
  • @nestjsx/crud-request - ib pob uas muab cov lus nug tsim / parser siv rau sab pem hauv ntej;
  • @nestjsx/crud-typeorm - ib pob rau kev koom ua ke nrog TypeORM, muab qhov yooj yim TypeOrmCrudService kev pabcuam nrog CRUD txoj hauv kev ua haujlwm nrog cov chaw hauv cov ntaub ntawv.

Hauv no nyeem peb yuav xav tau pob zesjsx/crud thiab zesjsx/crud-typeorm. Ua ntej, cia peb muab lawv

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

Cov pob khoom chav kawm-transformer ΠΈ class-validator nyob rau hauv daim ntawv thov no yog yuav tsum tau rau ib tug declarative piav qhia txog cov kev cai rau transforming qauv piv txwv thiab validating cov kev thov tuaj, feem. Cov pob no yog los ntawm tib tus sau, yog li cov interfaces zoo sib xws.

Kev siv ncaj qha ntawm CRUD

Peb mam li muab ib daim ntawv teev cov neeg siv ua piv txwv qauv. Cov neeg siv yuav muaj cov nram qab no: id, username, displayName, email. id - auto-incrementing teb, email ΠΈ username - tshwj xeeb teb. Nws yog qhov yooj yim! Txhua yam uas tseem tshuav yog siv peb lub tswv yim hauv daim ntawv thov Nest.
Ua ntej koj yuav tsum tsim ib qho module users, leej twg yuav muaj lub luag haujlwm ua haujlwm nrog cov neeg siv. Cia peb siv cli los ntawm NestJS thiab ua tiav cov lus txib hauv cov npe hauv paus ntawm peb qhov project nest g module users.

zes g module cov neeg siv

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)

Nyob rau hauv no module peb yuav ntxiv ib qho chaw folder, qhov twg peb yuav muaj cov qauv ntawm no module. Tshwj xeeb, cia peb ntxiv ntawm no cov ntaub ntawv user.entity.ts nrog cov lus piav qhia ntawm tus qauv siv:

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

Txhawm rau kom tus qauv no "pom" los ntawm peb daim ntawv thov, nws yog ib qho tsim nyog nyob rau hauv lub module UsersModule ntshuam TypeOrmModule cov ntsiab lus hauv qab no:

users.module.ts

import { Module } from '@nestjs/common';
import { UsersController } from './controllers/users/users.controller';
import { UsersService } from './services/users/users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
controllers: [UsersController],
providers: [UsersService],
imports: [
TypeOrmModule.forFeature([User])
]
})
export class UsersModule {}

Ntawd yog, ntawm no peb import TypeOrmModule, qhov twg raws li tus txheej txheem parameter forFeature Peb qhia cov npe ntawm cov qauv uas muaj feem xyuam rau qhov module no.

Txhua yam uas tseem tshuav yog tsim kom muaj qhov sib thooj hauv cov ntaub ntawv. Lub tshuab tsiv teb tsaws chaw ua haujlwm rau cov hom phiaj no. Txhawm rau tsim kev tsiv teb tsaws chaw raws li kev hloov pauv hauv cov qauv, koj yuav tsum tau khiav cov lus txib npm run migration:generate -- CreateUserTable:

Spoiler lub npe

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

Peb tsis tas yuav sau cov neeg tsiv teb tsaws chaw manually, txhua yam tshwm sim magically. Tsis yog qhov no yog txuj ci tseem ceeb! Txawm li cas los xij, tsis yog txhua yam. Cia wb mus saib cov ntaub ntawv migration tsim:

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

Raws li koj tuaj yeem pom, tsis tsuas yog txoj hauv kev rau kev pib tsiv teb tsaws tau raug tsim tawm, tab sis kuj yog txoj hauv kev rau dov rov qab. Zoo heev!
Txhua yam uas tseem tshuav yog yuav muab qhov kev tsiv teb tsaws chaw no. Qhov no yog ua tiav nrog cov lus txib hauv qab no:

npm run migration:run.

Ntawd yog nws, tam sim no cov kev hloov pauv tau hloov mus rau hauv cov ntaub ntawv.
Tom ntej no, peb yuav tsim ib qho kev pabcuam uas yuav muaj lub luag haujlwm rau kev ua haujlwm nrog cov neeg siv thiab tau txais nws los ntawm TypeOrmCrudService. Lub repository ntawm qhov chaw ntawm kev txaus siab yuav tsum raug xa mus rau qhov parameter ntawm niam txiv constructor, nyob rau hauv peb cov ntaub ntawv. User chaw cia khoom.

users.service.ts

import { Injectable } from '@nestjs/common';
import { TypeOrmCrudService } from '@nestjsx/crud-typeorm';
import { User } from '../../entities/user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
@Injectable()
export class UsersService extends TypeOrmCrudService<User>{
constructor(@InjectRepository(User) usersRepository: Repository<User>){
super(usersRepository);
}
}

Peb yuav xav tau qhov kev pabcuam no hauv tus maub los users. Txhawm rau tsim tus maub los, ntaus hauv lub console nest g controller users/controllers/users

zes g maub los cov neeg siv / tswj / cov neeg siv

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)

Cia peb qhib tus maub los no thiab kho nws kom ntxiv me ntsis khawv koob zesjsx/crud. Ib chav kawm UsersController Cia peb ntxiv ib tug decorator li no:

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

Crud yog tus dai kom zoo nkauj uas ntxiv rau tus tswj cov txheej txheem tsim nyog rau kev ua haujlwm nrog tus qauv. Hom qauv yog qhia hauv daim teb model.type decorator configurations.
Qhov thib ob kauj ruam yog siv lub interface CrudController<User>. "Assembled" controller code zoo li no:

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

Thiab nws yog tag nrho! Tam sim no tus maub los txhawb nqa tag nrho cov txheej txheem ua haujlwm nrog tus qauv! Tsis ntseeg kuv? Cia peb sim peb daim ntawv thov ua haujlwm!

Tsim ib qho Query Script hauv TestMace

Txhawm rau kuaj peb cov kev pabcuam peb yuav siv IDE los ua haujlwm nrog API TestMace. Vim li cas TestMace? Piv nrog rau cov khoom zoo sib xws, nws muaj qhov zoo hauv qab no:

  • muaj zog ua hauj lwm nrog variables. Tam sim no, muaj ntau ntau hom kev hloov pauv, txhua tus ua lub luag haujlwm tshwj xeeb: cov khoom sib txawv, cov hloov pauv hloov pauv, ib puag ncig hloov pauv. Txhua qhov sib txawv yog nyob rau ntawm lub pob nrog kev txhawb nqa rau cov cuab yeej qub txeeg qub teg;
  • Yooj yim tsim scripts tsis muaj programming. Qhov no yuav tau tham hauv qab no;
  • ib hom ntawv uas tib neeg nyeem tau uas tso cai rau koj txuag qhov project hauv kev tswj hwm version;
  • autocompletion, syntax highlighting, variable value highlighting;
  • API piav qhia kev txhawb nqa nrog lub peev xwm los ntawm Swagger.

Cia peb pib peb lub server nrog cov lus txib npm start thiab sim nkag mus rau cov npe ntawm cov neeg siv. Cov npe ntawm cov neeg siv, txiav txim siab los ntawm peb tus tswj hwm kev teeb tsa, tuaj yeem tau txais los ntawm url localhost: 3000 / cov neeg siv. Wb ua kev thov rau qhov url no.
Tom qab khiav TestMace koj tuaj yeem pom qhov interface zoo li no:

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Nyob rau sab laug sab saum toj yog ib qhov project tsob ntoo nrog lub hauv paus node project. Cia peb sim ua thawj qhov kev thov kom tau txais cov npe ntawm cov neeg siv. Rau qhov no peb yuav tsim ThovStep node Qhov no yog ua tiav hauv cov ntawv qhia zaub mov ntawm qhov Project node Ntxiv node -> RequestStep.

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Hauv qhov URL teb, paste localhost: 3000 / cov neeg siv thiab khiav qhov kev thov. Peb yuav tau txais code 200 nrog ib qho khoob khoob hauv lub cev teb. Nws yog to taub, peb tseem tsis tau ntxiv leej twg.
Cia peb tsim ib tsab ntawv uas yuav suav nrog cov kauj ruam hauv qab no:

  1. tsim tus neeg siv;
  2. thov rau tus id ntawm tus neeg siv tshiab tsim;
  3. rho tawm los ntawm tus neeg siv id tsim nyob rau hauv kauj ruam 1.

Yog li, cia peb mus. Txhawm rau kom yooj yim, cia peb tsim cov node zoo li nplaub tshev. Qhov tseem ceeb, qhov no tsuas yog ib daim nplaub tshev uas peb yuav khaws tag nrho cov ntawv. Txhawm rau tsim Folder node, xaiv qhov Project los ntawm cov ntawv qhia zaub mov ntawm node Ntxiv node -> Folder. Wb hu lub node kos-tsim. Hauv ib lub node kos-tsim Cia peb tsim peb qhov kev thov thawj zaug los tsim tus neeg siv. Wb hu rau qhov tsim tshiab node tsim-neeg siv. Ntawd yog, lub sijhawm node hierarchy yuav zoo li no:

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Wb mus rau qhov qhib tab tsim-neeg siv node. Cia peb nkag mus rau cov kev txwv hauv qab no rau kev thov:

  • Thov hom - POST
  • URL - localhost: 3000 / cov neeg siv
  • Lub cev - JSON nrog tus nqi {"email": "[email protected]", "displayName": "New user", "username": "user"}

Cia peb ua raws li qhov kev thov no. Peb daim ntawv thov hais tias cov ntaub ntawv tau tsim.

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Zoo, cia peb tshawb xyuas qhov tseeb no. Txhawm rau ua haujlwm nrog tus ID ntawm tus neeg siv tsim hauv cov kauj ruam tom ntej, qhov ntsuas no yuav tsum tau txais kev cawmdim. Lub mechanism yog zoo meej rau qhov no. dynamic variables. Cia peb siv peb tus piv txwv los saib seb yuav ua li cas nrog lawv. Hauv parsed tab ntawm cov lus teb, nyob ib sab ntawm tus id node hauv cov ntawv qhia zaub mov, xaiv cov khoom Muab rau qhov sib txawv. Nyob rau hauv lub dialog box koj yuav tsum teem cov nram qab no tsis:

  • Ntawm - nyob rau hauv uas cov poj koob yawm txwv los tsim ib tug dynamic sib txawv. Cia peb xaiv kos-tsim
  • Hloov lub npe - lub npe ntawm qhov hloov pauv no. Wb hu userId.

Nov yog qhov txheej txheem ntawm kev tsim kom muaj qhov sib txawv dynamic zoo li:

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Tam sim no, txhua zaus cov lus nug no raug tua, tus nqi ntawm qhov hloov pauv hloov pauv yuav hloov kho. Thiab vim dynamic variables txhawb lub mechanism ntawm hierarchical qub txeeg qub teg, sib txawv userId yuav muaj nyob rau hauv cov xeeb leej xeeb ntxwv kos-tsim node ntawm tej qib nesting.
Qhov kev hloov pauv no yuav muaj txiaj ntsig zoo rau peb hauv kev thov tom ntej. Namely, peb yuav thov tus neeg siv tshiab tsim. Raws li ib tug me nyuam ntawm node kos-tsim peb yuav tsim ib qho kev thov check-yog muaj nrog parameter url sib npaug localhost:3000/users/${$dynamicVar.userId}. Saib tsim ${variable_name} qhov no tau txais tus nqi ntawm qhov sib txawv. Vim Peb muaj qhov sib txawv dynamic, yog li kom tau txais nws koj yuav tsum nkag mus rau qhov khoom $dynamicVar, i.e. nkag mus rau qhov sib txawv dynamic userId yuav zoo li no ${$dynamicVar.userId}. Cia peb ua qhov kev thov thiab xyuas kom meej tias cov ntaub ntawv thov raug.
Cov kauj ruam kawg sab laug yog thov kom tshem tawm. Peb xav tau nws tsis tsuas yog mus xyuas lub lag luam ntawm lub deletion, tab sis kuj, yog li hais, mus ntxuav tom qab peb tus kheej nyob rau hauv lub database, vim hais tias Cov email thiab username teb yog qhov tshwj xeeb. Yog li, nyob rau hauv lub kos-tsim node peb yuav tsim ib tug delete-neeg thov nrog rau cov nram qab no tsis

  • Thov hom - DELETE
  • URL - localhost:3000/users/${$dynamicVar.userId}

Cia peb pib. Peb tos. Peb txaus siab rau qhov tshwm sim)

Zoo, tam sim no peb tuaj yeem khiav tag nrho cov ntawv no txhua lub sijhawm. Txhawm rau khiav cov ntawv koj yuav tsum xaiv los ntawm cov ntawv qhia zaub mov kos-tsim node yam khiav.

Quick CRUD creation nrog zes, @nestjsx/crud thiab TestMace

Cov nodes nyob rau hauv tsab ntawv yuav raug executed ib tug tom qab lwm
Koj tuaj yeem khaws cov ntawv no rau koj qhov project los ntawm kev khiav Cov ntaub ntawv -> Txuag qhov project.

xaus

Tag nrho cov yam ntxwv ntawm cov cuab yeej siv yooj yim tsis tuaj yeem haum rau hauv hom ntawv ntawm kab lus no. Raws li rau lub ntsiab culprit - lub pob zesjsx/crud - cov ntsiab lus hauv qab no tseem tsis tau pom dua:

  • kev cai validation thiab transformation ntawm cov qauv;
  • lus nug haib thiab nws yooj yim siv nyob rau hauv pem hauv ntej;
  • redefining thiab ntxiv txoj kev tshiab rau crud controllers;
  • kev txhawb nqa swagger;
  • kev tswj caching.

Txawm li cas los xij, txawm li cas los xij tau piav qhia hauv tsab xov xwm yog txaus kom nkag siab tias txawm tias lub tuam txhab lag luam zoo li NestJS muaj cov cuab yeej rau kev thov sai sai prototyping. Thiab zoo li IDE txias nyiam TestMace tso cai rau koj kom tswj tau ib qho pace.

Qhov chaw code rau kab lus no, nrog rau qhov project TestMace, muaj nyob rau hauv lub repository https://github.com/TestMace/nest-rest. Qhib ib qhov project TestMace tsuas yog ua nws hauv app Cov ntaub ntawv -> Qhib qhov project.

Tau qhov twg los: www.hab.com

Ntxiv ib saib