Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Ar hyn o bryd, mae'r API REST wedi dod yn safon ar gyfer datblygu cymwysiadau gwe, gan ganiatáu i ddatblygiad gael ei rannu'n rhannau annibynnol. Ar hyn o bryd mae fframweithiau poblogaidd amrywiol fel Angular, React, Vue ac eraill yn cael eu defnyddio ar gyfer UI. Gall datblygwyr backend ddewis o amrywiaeth eang o ieithoedd a fframweithiau. Heddiw hoffwn siarad am fframwaith o'r fath fel NestJS. Rydyn ni i mewn TestMace Rydym yn ei ddefnyddio'n weithredol ar gyfer prosiectau mewnol. Defnyddio nyth a phecyn @nestjsx/crud, byddwn yn creu cais CRUD syml.

Pam NestJS

Yn ddiweddar, mae cryn dipyn o fframweithiau backend wedi ymddangos yn y gymuned JavaScript. Ac os ydynt yn darparu galluoedd tebyg i Nyth o ran ymarferoldeb, yna mewn un peth mae'n bendant yn ennill - dyma'r bensaernïaeth. Mae'r nodweddion NestJS canlynol yn caniatáu ichi greu cymwysiadau diwydiannol a datblygu graddfa i dimau mawr:

  • defnyddio TypeScript fel y brif iaith ddatblygu. Er bod NestJS yn cefnogi JavaScript, efallai na fydd rhai swyddogaethau'n gweithio, yn enwedig os ydym yn sôn am becynnau trydydd parti;
  • presenoldeb cynhwysydd DI, sy'n eich galluogi i greu cydrannau sydd wedi'u cyplysu'n llac;
  • Rhennir ymarferoldeb y fframwaith ei hun yn gydrannau cyfnewidiadwy annibynnol. Er enghraifft, o dan y cwfl fel fframwaith gellir ei ddefnyddio fel mynegiAc ymprydio, i weithio gyda'r gronfa ddata, mae nyth allan o'r blwch yn darparu rhwymiadau i teip, mongoose, dilyniannu;
  • Mae NestJS yn agnostig platfform ac mae'n cefnogi REST, GraphQL, Websockets, gRPC, ac ati.

Mae'r fframwaith ei hun wedi'i ysbrydoli gan y fframwaith blaen Angular ac yn gysyniadol mae ganddo lawer yn gyffredin ag ef.

Gosod NestJS a Defnyddio'r Prosiect

Mae Nyth yn cynnwys pecyn nyth/cli, sy'n eich galluogi i ddefnyddio fframwaith cymhwysiad sylfaenol yn gyflym. Gadewch i ni osod y pecyn hwn yn fyd-eang:

npm install --global @nest/cli

Ar ôl gosod, byddwn yn cynhyrchu fframwaith sylfaenol ein cais gyda'r enw nyth-rest. Gwneir hyn gan ddefnyddio'r gorchymyn nest new nest-rest.

nyth newydd nyth- rest

dmitrii@dmitrii-HP-ZBook-17-G3:~/projects $ nest new nest-rest
  We will scaffold your app in a few seconds..

CREATE /nest-rest/.prettierrc (51 bytes)
CREATE /nest-rest/README.md (3370 bytes)
CREATE /nest-rest/nest-cli.json (84 bytes)
CREATE /nest-rest/nodemon-debug.json (163 bytes)
CREATE /nest-rest/nodemon.json (67 bytes)
CREATE /nest-rest/package.json (1805 bytes)
CREATE /nest-rest/tsconfig.build.json (97 bytes)
CREATE /nest-rest/tsconfig.json (325 bytes)
CREATE /nest-rest/tslint.json (426 bytes)
CREATE /nest-rest/src/app.controller.spec.ts (617 bytes)
CREATE /nest-rest/src/app.controller.ts (274 bytes)
CREATE /nest-rest/src/app.module.ts (249 bytes)
CREATE /nest-rest/src/app.service.ts (142 bytes)
CREATE /nest-rest/src/main.ts (208 bytes)
CREATE /nest-rest/test/app.e2e-spec.ts (561 bytes)
CREATE /nest-rest/test/jest-e2e.json (183 bytes)

? Which package manager would you ️ to use? yarn
 Installation in progress... 

  Successfully created project nest-rest
  Get started with the following commands:

$ cd nest-rest
$ yarn run start

                          Thanks for installing Nest 
                 Please consider donating to our open collective
                        to help us maintain this package.

                 Donate: https://opencollective.com/nest

Byddwn yn dewis edafedd fel ein rheolwr pecyn.
Ar y pwynt hwn gallwch chi gychwyn y gweinydd gyda'r gorchymyn npm start a mynd i'r cyfeiriad http://localhost:3000 gallwch weld y brif dudalen. Fodd bynnag, nid dyma pam yr ydym wedi ymgasglu yma ac yr ydym yn symud ymlaen.

Sefydlu gwaith gyda'r gronfa ddata

Dewisais PostrgreSQL fel y DBMS ar gyfer yr erthygl hon. Nid oes unrhyw anghydfod ynghylch chwaeth; yn fy marn i, dyma'r DBMS mwyaf aeddfed, gyda'r holl alluoedd angenrheidiol. Fel y soniwyd eisoes, mae Nyth yn darparu integreiddio gyda phecynnau amrywiol i weithio gyda chronfeydd data. Achos Gan fod fy newis yn disgyn ar PostgreSQL, byddai'n rhesymegol dewis TypeORM fel ORM. Gadewch i ni osod y pecynnau angenrheidiol ar gyfer integreiddio â'r gronfa ddata:

yarn add typeorm @nestjs/typeorm pg

Mewn trefn, ar gyfer beth mae angen pob pecyn:

  1. typeorm - pecyn yn uniongyrchol o'r ORM ei hun;
  2. @nestjs/typeorm - pecyn TypeORM ar gyfer NestJS. Yn ychwanegu modiwlau ar gyfer mewnforio i fodiwlau prosiect, yn ogystal â set o addurnwyr cynorthwyol;
  3. pg - gyrrwr ar gyfer gweithio gyda PostgreSQL.

Iawn, mae'r pecynnau wedi'u gosod, nawr mae angen i chi lansio'r gronfa ddata ei hun. I ddefnyddio'r gronfa ddata, byddaf yn defnyddio docker-compose.yml gyda'r cynnwys canlynol:

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

Fel y gallwch weld, mae'r ffeil hon yn ffurfweddu lansiad 2 gynhwysydd:

  1. Mae db yn gynhwysydd sy'n cynnwys y gronfa ddata yn uniongyrchol. Yn ein hachos ni, defnyddir fersiwn postgresql 11.2;
  2. gweinyddwr - rheolwr cronfa ddata. Yn darparu rhyngwyneb gwe ar gyfer gwylio a rheoli'r gronfa ddata.

I weithio gyda chysylltiadau tcp, ychwanegais y ffurfwedd ganlynol.

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

Dyna i gyd, gallwch chi ddechrau cynwysyddion gyda'r gorchymyn docker-compose up -d. Neu mewn consol ar wahân gyda'r gorchymyn docker-compose up.

Felly, mae'r pecynnau wedi'u gosod, mae'r gronfa ddata wedi'i lansio, y cyfan sydd ar ôl yw eu gwneud yn ffrindiau â'i gilydd. I wneud hyn, mae angen ichi ychwanegu'r ffeil ganlynol at wraidd y prosiect: 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"
}
}

Bydd y ffurfweddiad hwn yn cael ei ddefnyddio ar gyfer cli typeorm.

Edrychwn ar y cyfluniad hwn yn fwy manwl. Ar linellau 3 a 4 rydym yn cael yr enw defnyddiwr a chyfrinair o'r newidynnau amgylchedd. Mae hyn yn gyfleus pan fydd gennych sawl amgylchedd (dev, llwyfan, prod, ac ati). Yn ddiofyn, postgres yw'r enw defnyddiwr ac mae'r cyfrinair yn enghraifft. Mae gweddill y cyfluniad yn ddibwys, felly byddwn yn canolbwyntio ar y paramedrau mwyaf diddorol yn unig:

  • cydamseru - Yn nodi a ddylai sgema'r gronfa ddata gael ei greu'n awtomatig pan fydd y rhaglen yn dechrau. Byddwch yn ofalus gyda'r opsiwn hwn a pheidiwch â'i ddefnyddio wrth gynhyrchu, fel arall byddwch yn colli data. Mae'r opsiwn hwn yn gyfleus wrth ddatblygu a dadfygio cais. Fel dewis arall i'r opsiwn hwn, gallwch ddefnyddio'r gorchymyn schema:sync oddi wrth CLI TypeORM.
  • dropSchema - ailosodwch y sgema bob tro y sefydlir cysylltiad. Yn union fel yr un blaenorol, dim ond wrth ddatblygu a dadfygio'r cais y dylid defnyddio'r opsiwn hwn.
  • endidau - pa lwybrau i chwilio am ddisgrifiadau o fodelau. Sylwch fod chwilio trwy fwgwd yn cael ei gefnogi.
  • cli.entitiesDir yw'r cyfeiriadur lle dylid storio modelau a grëwyd o'r TypeORM CLI yn ddiofyn.

Er mwyn i ni allu defnyddio holl nodweddion TypeORM yn ein cymhwysiad Nyth, mae angen i ni fewnforio'r modiwl TypeOrmModule в AppModule. Y rhai. eich AppModule bydd yn edrych fel hyn:

ap.modiwl.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 {}

Fel efallai y byddwch wedi sylwi, y dull forRoot trosglwyddir yr un ffurfweddiad ar gyfer gweithio gyda'r gronfa ddata ag yn y ffeil ormconfig.ts

Mae'r cyffyrddiad olaf yn parhau - ychwanegwch sawl tasg ar gyfer gweithio gyda TypeORM yn package.json. Y ffaith yw bod y CLI wedi'i ysgrifennu mewn javascript ac yn rhedeg yn yr amgylchedd nodejs. Fodd bynnag, bydd ein holl fodelau a mudo yn cael eu hysgrifennu mewn teipysgrif. Felly, mae angen trawsffurfio ein mudo a'n modelau cyn defnyddio'r CLI. Ar gyfer hyn mae angen y pecyn ts-node arnom:

yarn add -D ts-node

Ar ôl hynny, ychwanegwch y gorchmynion angenrheidiol at 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"

Mae'r gorchymyn cyntaf, typeorm, yn ychwanegu deunydd lapio ts-nod i redeg y cli TypeORM. Mae'r gorchmynion sy'n weddill yn llwybrau byr cyfleus y byddwch chi, fel datblygwr, yn eu defnyddio bron bob dydd:
migration:generate — creu ymfudiadau yn seiliedig ar newidiadau yn eich modelau.
migration:create — creu mudo gwag.
migration:run — lansio ymfudiadau.
Wel, dyna ni nawr, rydyn ni wedi ychwanegu'r pecynnau angenrheidiol, wedi ffurfweddu'r cymhwysiad i weithio gyda'r gronfa ddata o'r cli ac o'r rhaglen ei hun, a hefyd wedi lansio'r DBMS. Mae'n bryd ychwanegu rhesymeg at ein cais.

Gosod pecynnau ar gyfer creu CRUD

Gan ddefnyddio Nest yn unig, gallwch greu API sy'n eich galluogi i greu, darllen, diweddaru a dileu endid. Bydd yr ateb hwn mor hyblyg â phosibl, ond mewn rhai achosion bydd yn ddiangen. Er enghraifft, os oes angen i chi greu prototeip yn gyflym, yn aml gallwch aberthu hyblygrwydd ar gyfer cyflymder datblygiad. Mae llawer o fframweithiau yn darparu ymarferoldeb ar gyfer cynhyrchu CRUD trwy ddisgrifio model data endid penodol. Ac nid yw Nyth yn eithriad! Darperir y swyddogaeth hon gan y pecyn @nestjsx/crud. Mae ei alluoedd yn ddiddorol iawn:

  • gosod a chyfluniad hawdd;
  • annibyniaeth DBMS;
  • iaith ymholiad bwerus gyda'r gallu i hidlo, tudalennu, didoli, llwytho perthnasoedd ac endidau nythu, caching, ac ati;
  • pecyn ar gyfer cynhyrchu ceisiadau ar y pen blaen;
  • hawdd diystyru dulliau rheolydd;
  • cyfluniad bach;
  • cefnogaeth dogfennaeth swagger.

Rhennir y swyddogaeth yn sawl pecyn:

  • @nestjsx/crud - y pecyn sylfaenol y mae'r addurnwr yn ei ddarparu Crud( ) ar gyfer cynhyrchu, ffurfweddu a dilysu llwybrau;
  • @nestjsx/crud-cais — pecyn sy'n darparu adeiladwr ymholiad/parser i'w ddefnyddio ar ochr y blaen;
  • @nestjsx/crud-typeorm - pecyn ar gyfer integreiddio â TypeORM, gan ddarparu dulliau CRUD i'r gwasanaeth TypeOrmCrudService sylfaenol ar gyfer gweithio gydag endidau yn y gronfa ddata.

Yn y tiwtorial hwn bydd angen pecynnau arnom nythjsx/crud a nythjsx/crud-typeorm. Yn gyntaf, gadewch i ni eu rhoi

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

Pecynnau dosbarth-trawsnewidydd и dosbarth-ddilyswr yn y cais hwn am ddisgrifiad datganiadol o'r rheolau ar gyfer trawsnewid enghreifftiau enghreifftiol a dilysu ceisiadau sy'n dod i mewn, yn y drefn honno. Daw'r pecynnau hyn gan yr un awdur, felly mae'r rhyngwynebau yn debyg.

Gweithredu CRUD yn uniongyrchol

Byddwn yn cymryd rhestr o ddefnyddwyr fel model enghreifftiol. Bydd gan ddefnyddwyr y meysydd canlynol: id, username, displayName, email. id - maes cynyddu ceir, email и username - meysydd unigryw. Mae'n syml! Y cyfan sydd ar ôl yw gweithredu ein syniad ar ffurf cais Nyth.
Yn gyntaf mae angen i chi greu modiwl users, pwy fydd yn gyfrifol am weithio gyda defnyddwyr. Gadewch i ni ddefnyddio'r cli o NestJS a gweithredu'r gorchymyn yng nghyfeiriadur gwraidd ein prosiect nest g module users.

defnyddwyr modiwl nyth 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)

Yn y modiwl hwn byddwn yn ychwanegu ffolder endidau, lle bydd gennym fodelau'r modiwl hwn. Yn benodol, gadewch i ni ychwanegu yma y ffeil user.entity.ts gyda disgrifiad o'r model defnyddiwr:

endid.defnyddiwr

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

Er mwyn i'r model hwn gael ei “weld” gan ein cais, mae'n angenrheidiol yn y modiwl UsersModule mewnforio TypeOrmModule y cynnwys canlynol:

defnyddwyr.modiwl.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 {}

Hynny yw, dyma ni'n mewnforio TypeOrmModule, lle fel paramedr dull forFeature Rydym yn nodi rhestr o fodelau sy'n gysylltiedig â'r modiwl hwn.

Y cyfan sydd ar ôl yw creu'r endid cyfatebol yn y gronfa ddata. Mae'r mecanwaith mudo yn gwasanaethu at y dibenion hyn. I greu mudo yn seiliedig ar newidiadau mewn modelau, mae angen i chi redeg y gorchymyn npm run migration:generate -- CreateUserTable:

teitl anrheithiwr

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

Nid oedd yn rhaid i ni ysgrifennu'r mudo â llaw, digwyddodd popeth yn hudol. Onid gwyrth yw hyn! Fodd bynnag, nid dyna'r cyfan. Gadewch i ni edrych ar y ffeil mudo a grëwyd:

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

Fel y gallwch weld, nid yn unig y dull ar gyfer cychwyn y mudo yn cael ei gynhyrchu'n awtomatig, ond hefyd y dull ar gyfer ei rolio'n ôl. Ffantastig!
Y cyfan sydd ar ôl yw cyflwyno'r ymfudiad hwn. Gwneir hyn gyda'r gorchymyn canlynol:

npm run migration:run.

Dyna ni, nawr mae'r newidiadau sgema wedi mudo i'r gronfa ddata.
Nesaf, byddwn yn creu gwasanaeth a fydd yn gyfrifol am weithio gyda defnyddwyr ac yn etifeddu ohono TypeOrmCrudService. Rhaid trosglwyddo ystorfa'r endid o ddiddordeb i baramedr y rhiant-adeiladwr, yn ein hachos ni User ystorfa.

defnyddwyr.gwasanaethau

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

Bydd angen y gwasanaeth hwn arnom yn y rheolydd users. I greu rheolydd, teipiwch y consol nest g controller users/controllers/users

nyth g rheolydd defnyddwyr/rheolwyr/defnyddwyr

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)

Gadewch i ni agor y rheolydd hwn a'i olygu i ychwanegu ychydig o hud nythjsx/crud. Fesul dosbarth UsersController Gadewch i ni ychwanegu addurnwr fel hyn:

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

Crud yn addurnwr sy'n ychwanegu at y rheolydd y dulliau angenrheidiol ar gyfer gweithio gyda'r model. Mae'r math o fodel wedi'i nodi yn y maes model.type cyfluniadau addurnwr.
Yr ail gam yw gweithredu'r rhyngwyneb CrudController<User>. Mae cod rheolydd “Gosod” yn edrych fel hyn:

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

Ac mae'r cyfan! Nawr mae'r rheolydd yn cefnogi'r set gyfan o weithrediadau gyda'r model! Peidiwch â chredu fi? Gadewch i ni roi cynnig ar ein cais ar waith!

Creu Sgript Ymholiad yn TestMace

I brofi ein gwasanaeth byddwn yn defnyddio DRhA i weithio gyda'r API TestMace. Pam TestMace? O'i gymharu â chynhyrchion tebyg, mae ganddo'r manteision canlynol:

  • gwaith pwerus gyda newidynnau. Ar hyn o bryd, mae yna sawl math o newidynnau, ac mae pob un ohonynt yn chwarae rhan benodol: newidynnau adeiledig, newidynnau deinamig, newidynnau amgylchedd. Mae pob newidyn yn perthyn i nod gyda chefnogaeth i'r mecanwaith etifeddiaeth;
  • Creu sgriptiau yn hawdd heb raglennu. Bydd hyn yn cael ei drafod isod;
  • fformat y gall pobl ei ddarllen sy'n eich galluogi i gadw'r prosiect mewn systemau rheoli fersiynau;
  • awtolenwi, amlygu cystrawen, amlygu gwerth amrywiol;
  • Cefnogaeth disgrifiad API gyda'r gallu i fewnforio o Swagger.

Gadewch i ni ddechrau ein gweinydd gyda'r gorchymyn npm start a cheisio cyrchu'r rhestr o ddefnyddwyr. Gellir cael y rhestr o ddefnyddwyr, yn ôl ein cyfluniad rheolydd, o'r url localhost: 3000/users. Gadewch i ni wneud cais i'r url hwn.
Ar ôl rhedeg TestMace gallwch weld rhyngwyneb fel hyn:

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Ar y chwith uchaf mae coeden brosiect gyda nod gwraidd Prosiect. Gadewch i ni geisio creu'r cais cyntaf i gael rhestr o ddefnyddwyr. Ar gyfer hyn byddwn yn creu Cais Cam nôd Gwneir hyn yn newislen cyd-destun nod y Prosiect Ychwanegu nod -> RequestStep.

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Yn y maes URL, gludwch localhost: 3000 / defnyddwyr a rhedeg y cais. Byddwn yn derbyn cod 200 gydag arae wag yn y corff ymateb. Mae'n ddealladwy, nid ydym wedi ychwanegu unrhyw un eto.
Gadewch i ni greu sgript a fydd yn cynnwys y camau canlynol:

  1. creu defnyddiwr;
  2. cais am ID y defnyddiwr sydd newydd ei greu;
  3. dileu gan ID defnyddiwr a grëwyd yng ngham 1.

Felly, gadewch i ni fynd. Er hwylustod, gadewch i ni greu nod tebyg Ffolder. Yn y bôn, dim ond ffolder yw hwn lle byddwn yn achub y sgript gyfan. I greu nod Ffolder, dewiswch Project o ddewislen cyd-destun y nod Ychwanegu nod -> Ffolder. Gadewch i ni alw'r nod siec-creu. Y tu mewn i nod siec-creu Gadewch i ni greu ein cais cyntaf i greu defnyddiwr. Gadewch i ni alw'r nod newydd ei greu creu-ddefnyddiwr. Hynny yw, ar hyn o bryd bydd yr hierarchaeth nodau yn edrych fel hyn:

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Gadewch i ni fynd i'r tab agored creu-ddefnyddiwr nôd. Gadewch i ni nodi'r paramedrau canlynol ar gyfer y cais:

  • Math o gais - SWYDD
  • URL - localhost: 3000 / defnyddwyr
  • Corff - JSON gyda gwerth {"email": "[email protected]", "displayName": "New user", "username": "user"}

Gadewch i ni gyflawni'r cais hwn. Mae ein cais yn dweud bod y cofnod wedi'i greu.

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Wel, gadewch i ni wirio'r ffaith hon. Er mwyn gweithredu gydag id y defnyddiwr a grëwyd yn y camau dilynol, rhaid cadw'r paramedr hwn. Mae'r mecanwaith yn berffaith ar gyfer hyn. newidynnau deinamig. Gadewch i ni ddefnyddio ein hesiampl i edrych ar sut i weithio gyda nhw. Yn y tab wedi'i ddosrannu o'r ymateb, wrth ymyl y nod adnabod yn y ddewislen cyd-destun, dewiswch yr eitem Aseinio i newidyn. Yn y blwch deialog rhaid i chi osod y paramedrau canlynol:

  • Nôd — ym mha un o'r hynafiaid i greu newidyn deinamig. Gadewch i ni ddewis siec-creu
  • Enw amrywiol - enw'r newidyn hwn. Gadewch i ni alw userId.

Dyma sut olwg sydd ar y broses o greu newidyn deinamig:

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Nawr, bob tro y bydd yr ymholiad hwn yn cael ei weithredu, bydd gwerth y newidyn deinamig yn cael ei ddiweddaru. Ac oherwydd mae newidynnau deinamig yn cefnogi mecanwaith etifeddiaeth hierarchaidd, newidyn userId bydd ar gael mewn disgynyddion siec-creu nod unrhyw lefel nythu.
Bydd y newidyn hwn yn ddefnyddiol i ni yn y cais nesaf. Sef, byddwn yn gofyn am y defnyddiwr sydd newydd ei greu. Fel plentyn o nod siec-creu byddwn yn creu cais check-os yn bodoli gyda pharamedr url cyfartal localhost:3000/users/${$dynamicVar.userId}. Gweld dyluniad ${variable_name} mae hyn yn cael gwerth newidyn. Achos Mae gennym newidyn deinamig, felly i'w gael mae angen i chi gael mynediad i'r gwrthrych $dynamicVar, h.y. cyrchu newidyn deinamig yn llwyr userId bydd yn edrych fel hyn ${$dynamicVar.userId}. Gadewch i ni weithredu'r cais a gwneud yn siŵr y gofynnir am y data yn gywir.
Y cam olaf ar ôl yw gofyn am ddileu. Mae ei angen arnom nid yn unig i wirio gweithrediad y dileu, ond hefyd, fel petai, i lanhau ar ôl ein hunain yn y gronfa ddata, oherwydd Mae'r meysydd e-bost ac enw defnyddiwr yn unigryw. Felly, yn y nod creu siec byddwn yn creu cais dileu-ddefnyddiwr gyda'r paramedrau canlynol

  • Math o gais - DILEU
  • URL - localhost:3000/users/${$dynamicVar.userId}

Gadewch i ni lansio. Rydym yn aros. Rydyn ni'n mwynhau'r canlyniad)

Wel, nawr gallwn redeg y sgript gyfan hon ar unrhyw adeg. I redeg y sgript mae angen i chi ddewis o'r ddewislen cyd-destun siec-creu eitem nod Run.

Creu CRUD cyflym gyda nyth, @nestjsx/crud a TestMace

Bydd y nodau yn y sgript yn cael eu gweithredu un ar ôl y llall
Gallwch arbed y sgript hon i'ch prosiect trwy redeg Ffeil -> Arbed prosiect.

Casgliad

Ni allai holl nodweddion yr offer a ddefnyddiwyd ffitio i fformat yr erthygl hon. O ran y prif droseddwr - y pecyn nythjsx/crud - mae'r pynciau canlynol yn dal heb eu cynnwys:

  • dilysu arferiad a thrawsnewid modelau;
  • iaith ymholiad grymus a'i defnydd cyfleus yn y blaen;
  • ailddiffinio ac ychwanegu dulliau newydd at reolwyr crai;
  • cefnogaeth swagger;
  • rheoli caching.

Fodd bynnag, mae hyd yn oed yr hyn a ddisgrifir yn yr erthygl yn ddigon i ddeall bod gan hyd yn oed fframwaith menter o'r fath â NestJS offer ar gyfer prototeipio cymwysiadau cyflym. Ac IDE mor oer fel TestMace yn eich galluogi i gynnal cyflymder penodol.

Cod ffynhonnell ar gyfer yr erthygl hon, ynghyd â'r prosiect TestMace, ar gael yn yr ystorfa https://github.com/TestMace/nest-rest. I agor prosiect TestMace dim ond yn ei wneud yn yr app Ffeil -> Prosiect agored.

Ffynhonnell: hab.com

Ychwanegu sylw