Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

فی الحال، REST API ویب ایپلیکیشن ڈویلپمنٹ کے لیے ایک معیار بن گیا ہے، جس سے ترقی کو آزاد حصوں میں تقسیم کیا جا سکتا ہے۔ مختلف مشہور فریم ورک جیسے Angular، React، Vue اور دیگر فی الحال UI کے لیے استعمال ہوتے ہیں۔ بیک اینڈ ڈویلپر زبانوں اور فریم ورک کی وسیع اقسام میں سے انتخاب کر سکتے ہیں۔ آج میں اس طرح کے ایک فریم ورک کے بارے میں بات کرنا چاہوں گا۔ NestJS. ہم میں ہیں ٹیسٹ میس ہم اسے اندرونی منصوبوں کے لیے فعال طور پر استعمال کرتے ہیں۔ گھوںسلا اور پیکیج کا استعمال کرتے ہوئے @nestjsx/crud، ہم ایک سادہ CRUD ایپلیکیشن بنائیں گے۔

کیوں NestJS

حال ہی میں، جاوا اسکرپٹ کمیونٹی میں بہت سارے بیک اینڈ فریم ورک نمودار ہوئے ہیں۔ اور اگر فعالیت کے لحاظ سے وہ Nest کو اسی طرح کی صلاحیتیں فراہم کرتے ہیں، تو ایک چیز میں یہ یقینی طور پر جیت جاتا ہے - یہ فن تعمیر ہے۔ NestJS کی درج ذیل خصوصیات آپ کو صنعتی ایپلی کیشنز بنانے اور بڑی ٹیموں کو ترقی دینے کی اجازت دیتی ہیں۔

  • TypeScript کو بنیادی ترقیاتی زبان کے طور پر استعمال کرنا۔ اگرچہ NestJS JavaScript کو سپورٹ کرتا ہے، ہو سکتا ہے کچھ فعالیت کام نہ کرے، خاص طور پر اگر ہم تھرڈ پارٹی پیکجز کے بارے میں بات کر رہے ہوں۔
  • ڈی آئی کنٹینر کی موجودگی، جو آپ کو ڈھیلے طریقے سے جوڑے ہوئے اجزاء بنانے کی اجازت دیتا ہے۔
  • خود فریم ورک کی فعالیت کو آزاد تبادلہ اجزاء میں تقسیم کیا گیا ہے۔ مثال کے طور پر، ایک فریم ورک کے طور پر ہڈ کے نیچے اس کے طور پر استعمال کیا جا سکتا ہے ایکسپریساور تیز کرنا، ڈیٹا بیس کے ساتھ کام کرنے کے لیے، نیسٹ آؤٹ آف دی باکس کو بائنڈنگ فراہم کرتا ہے۔ ٹائپفارم, منگوس, سیکوئلائز;
  • NestJS پلیٹ فارم ایگنوسٹک ہے اور REST، GraphQL، Websockets، gRPC وغیرہ کو سپورٹ کرتا ہے۔

فریم ورک خود Angular فرنٹ اینڈ فریم ورک سے متاثر ہے اور تصوراتی طور پر اس میں بہت کچھ مشترک ہے۔

NestJS انسٹال کرنا اور پروجیکٹ کو تعینات کرنا

Nest ایک پیکیج پر مشتمل ہے۔ گھوںسلا/cli، جو آپ کو بنیادی ایپلیکیشن فریم ورک کو تیزی سے تعینات کرنے کی اجازت دیتا ہے۔ آئیے اس پیکیج کو عالمی سطح پر انسٹال کریں:

npm install --global @nest/cli

تنصیب کے بعد، ہم نام کے ساتھ اپنی درخواست کا بنیادی فریم ورک تیار کریں گے۔ Nest-rest یہ کمانڈ کا استعمال کرتے ہوئے کیا جاتا ہے۔ nest new nest-rest.

نیسٹ نیو نیسٹ ریسٹ

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

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

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

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

$ cd nest-rest
$ yarn run start

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

                 Donate: https://opencollective.com/nest

ہم اپنے پیکیج مینیجر کے طور پر سوت کا انتخاب کریں گے۔
اس مقام پر آپ کمانڈ کے ساتھ سرور شروع کر سکتے ہیں۔ npm start اور ایڈریس پر جا رہے ہیں۔ http://localhost:3000 آپ مرکزی صفحہ دیکھ سکتے ہیں۔ تاہم، اس لیے ہم یہاں جمع نہیں ہوئے اور آگے بڑھ رہے ہیں۔

ڈیٹا بیس کے ساتھ کام کو ترتیب دینا

میں نے اس مضمون کے لیے PostrgreSQL کو بطور DBMS منتخب کیا۔ ذوق کے بارے میں کوئی تنازعہ نہیں ہے؛ میری رائے میں، یہ سب سے پختہ DBMS ہے، جس میں تمام ضروری صلاحیتیں موجود ہیں۔ جیسا کہ پہلے ہی ذکر کیا گیا ہے، Nest ڈیٹا بیس کے ساتھ کام کرنے کے لیے مختلف پیکجوں کے ساتھ انضمام فراہم کرتا ہے۔ کیونکہ چونکہ میری پسند PostgreSQL پر پڑی، اس لیے TypeORM کو ORM کے طور پر منتخب کرنا منطقی ہوگا۔ آئیے ڈیٹا بیس کے ساتھ انضمام کے لیے ضروری پیکجز انسٹال کرتے ہیں:

yarn add typeorm @nestjs/typeorm pg

ترتیب میں، ہر پیکج کے لیے کیا ضرورت ہے:

  1. typeorm - براہ راست ORM سے ایک پیکیج؛
  2. @nestjs/typeorm - NestJS کے لیے TypeORM پیکیج۔ پروجیکٹ ماڈیولز میں درآمد کرنے کے لیے ماڈیولز شامل کرتا ہے، نیز مددگار ڈیکوریٹرز کا ایک سیٹ؛
  3. pg - PostgreSQL کے ساتھ کام کرنے کے لیے ڈرائیور۔

ٹھیک ہے، پیکجز انسٹال ہو چکے ہیں، اب آپ کو خود ڈیٹا بیس لانچ کرنے کی ضرورت ہے۔ ڈیٹا بیس کو تعینات کرنے کے لیے، میں درج ذیل مواد کے ساتھ docker-compose.yml استعمال کروں گا۔

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

جیسا کہ آپ دیکھ سکتے ہیں، یہ فائل 2 کنٹینرز کے اجراء کو ترتیب دیتی ہے:

  1. db ایک کنٹینر ہے جس میں براہ راست ڈیٹا بیس ہوتا ہے۔ ہمارے معاملے میں، postgresql ورژن 11.2 استعمال ہوتا ہے۔
  2. منتظم — ڈیٹا بیس مینیجر۔ ڈیٹا بیس کو دیکھنے اور انتظام کرنے کے لیے ایک ویب انٹرفیس فراہم کرتا ہے۔

tcp کنکشن کے ساتھ کام کرنے کے لیے، میں نے درج ذیل کنفیگریشن کو شامل کیا۔

postgresql.conf

# -----------------------------
# PostgreSQL configuration file
# -----------------------------
#
# This file consists of lines of the form:
#
#   name = value
#
# (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
# "#" anywhere on a line.  The complete list of parameter names and allowed
# values can be found in the PostgreSQL documentation.
#
# The commented-out settings shown in this file represent the default values.
# Re-commenting a setting is NOT sufficient to revert it to the default value;
# you need to reload the server.
#
# This file is read on server startup and when the server receives a SIGHUP
# signal.  If you edit the file on a running system, you have to SIGHUP the
# server for the changes to take effect, run "pg_ctl reload", or execute
# "SELECT pg_reload_conf()".  Some parameters, which are marked below,
# require a server shutdown and restart to take effect.
#
# Any parameter can also be given as a command-line option to the server, e.g.,
# "postgres -c log_connections=on".  Some parameters can be changed at run time
# with the "SET" SQL command.
#
# Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
#                MB = megabytes                     s   = seconds
#                GB = gigabytes                     min = minutes
#                TB = terabytes                     h   = hours
#                                                   d   = days
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.
#data_directory = 'ConfigDir'       # use data in another directory
# (change requires restart)
#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
# (change requires restart)
#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
# (change requires restart)
# If external_pid_file is not explicitly set, no extra PID file is written.
#external_pid_file = ''         # write an extra PID file
# (change requires restart)
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'
#listen_addresses = 'localhost'     # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
#port = 5432                # (change requires restart)
#max_connections = 100          # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directories = '/tmp'   # comma-separated list of directories
# (change requires restart)
#unix_socket_group = ''         # (change requires restart)
#unix_socket_permissions = 0777     # begin with 0 to use octal notation
# (change requires restart)
#bonjour = off              # advertise server via Bonjour
# (change requires restart)
#bonjour_name = ''          # defaults to the computer name
# (change requires restart)
# - TCP Keepalives -
# see "man 7 tcp" for details
#tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
# 0 selects the system default
#tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
# 0 selects the system default
#tcp_keepalives_count = 0       # TCP_KEEPCNT;
# 0 selects the system default
# - Authentication -
#authentication_timeout = 1min      # 1s-600s
#password_encryption = md5      # md5 or scram-sha-256
#db_user_namespace = off
# GSSAPI using Kerberos
#krb_server_keyfile = ''
#krb_caseins_users = off
# - SSL -
#ssl = off
#ssl_ca_file = ''
#ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
# - Memory -
#shared_buffers = 32MB          # min 128kB
# (change requires restart)
#huge_pages = try           # on, off, or try
# (change requires restart)
#temp_buffers = 8MB         # min 800kB
#max_prepared_transactions = 0      # zero disables the feature
# (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
#work_mem = 4MB             # min 64kB
#maintenance_work_mem = 64MB        # min 1MB
#autovacuum_work_mem = -1       # min 1MB, or -1 to use maintenance_work_mem
#max_stack_depth = 2MB          # min 100kB
#shared_memory_type = mmap      # the default is the first option
# supported by the operating system:
#   mmap
#   sysv
#   windows
# (change requires restart)
#dynamic_shared_memory_type = posix # the default is the first option
# supported by the operating system:
#   posix
#   sysv
#   windows
#   mmap
# (change requires restart)
# - Disk -
#temp_file_limit = -1           # limits per-process temp file space
# in kB, or -1 for no limit
# - Kernel Resources -
#max_files_per_process = 1000       # min 25
# (change requires restart)
# - Cost-Based Vacuum Delay -
#vacuum_cost_delay = 0          # 0-100 milliseconds (0 disables)
#vacuum_cost_page_hit = 1       # 0-10000 credits
#vacuum_cost_page_miss = 10     # 0-10000 credits
#vacuum_cost_page_dirty = 20        # 0-10000 credits
#vacuum_cost_limit = 200        # 1-10000 credits
# - Background Writer -
#bgwriter_delay = 200ms         # 10-10000ms between rounds
#bgwriter_lru_maxpages = 100        # max buffers written/round, 0 disables
#bgwriter_lru_multiplier = 2.0      # 0-10.0 multiplier on buffers scanned/round
#bgwriter_flush_after = 0       # measured in pages, 0 disables
# - Asynchronous Behavior -
#effective_io_concurrency = 1       # 1-1000; 0 disables prefetching
#max_worker_processes = 8       # (change requires restart)
#max_parallel_maintenance_workers = 2   # taken from max_parallel_workers
#max_parallel_workers_per_gather = 2    # taken from max_parallel_workers
#parallel_leader_participation = on
#max_parallel_workers = 8       # maximum number of max_worker_processes that
# can be used in parallel operations
#old_snapshot_threshold = -1        # 1min-60d; -1 disables; 0 is immediate
# (change requires restart)
#backend_flush_after = 0        # measured in pages, 0 disables
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
#wal_level = replica            # minimal, replica, or logical
# (change requires restart)
#fsync = on             # flush data to disk for crash safety
# (turning this off can cause
# unrecoverable data corruption)
#synchronous_commit = on        # synchronization level;
# off, local, remote_write, remote_apply, or on
#wal_sync_method = fsync        # the default is the first option
# supported by the operating system:
#   open_datasync
#   fdatasync (default on Linux)
#   fsync
#   fsync_writethrough
#   open_sync
#full_page_writes = on          # recover from partial page writes
#wal_compression = off          # enable compression of full-page writes
#wal_log_hints = off            # also do full page writes of non-critical updates
# (change requires restart)
#wal_buffers = -1           # min 32kB, -1 sets based on shared_buffers
# (change requires restart)
#wal_writer_delay = 200ms       # 1-10000 milliseconds
#wal_writer_flush_after = 1MB       # measured in pages, 0 disables
#commit_delay = 0           # range 0-100000, in microseconds
#commit_siblings = 5            # range 1-1000
# - Checkpoints -
#checkpoint_timeout = 5min      # range 30s-1d
#max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_flush_after = 0     # measured in pages, 0 disables
#checkpoint_warning = 30s       # 0 disables
# - Archiving -
#archive_mode = off     # enables archiving; off, on, or always
# (change requires restart)
#archive_command = ''       # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
#               %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0        # force a logfile segment switch after this
# number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
#restore_command = ''       # command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
#               %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
#archive_cleanup_command = ''   # command to execute at every restartpoint
#recovery_end_command = ''  # command to execute at completion of recovery
# - Recovery Target -
# Set these only when performing a targeted recovery.
#recovery_target = ''       # 'immediate' to end recovery as soon as a
# consistent state is reached
# (change requires restart)
#recovery_target_name = ''  # the named restore point to which recovery will proceed
# (change requires restart)
#recovery_target_time = ''  # the time stamp up to which recovery will proceed
# (change requires restart)
#recovery_target_xid = ''   # the transaction ID up to which recovery will proceed
# (change requires restart)
#recovery_target_lsn = ''   # the WAL LSN up to which recovery will proceed
# (change requires restart)
#recovery_target_inclusive = on # Specifies whether to stop:
# just after the specified recovery target (on)
# just before the recovery target (off)
# (change requires restart)
#recovery_target_timeline = 'latest'    # 'current', 'latest', or timeline ID
# (change requires restart)
#recovery_target_action = 'pause'   # 'pause', 'promote', 'shutdown'
# (change requires restart)
#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
# - Sending Servers -
# Set these on the master and on any standby that will send replication data.
#max_wal_senders = 10       # max number of walsender processes
# (change requires restart)
#wal_keep_segments = 0      # in logfile segments; 0 disables
#wal_sender_timeout = 60s   # in milliseconds; 0 disables
#max_replication_slots = 10 # max number of replication slots
# (change requires restart)
#track_commit_timestamp = off   # collect timestamp of transaction commit
# (change requires restart)
# - Master Server -
# These settings are ignored on a standby server.
#synchronous_standby_names = '' # standby servers that provide sync rep
# method to choose sync standbys, number of sync standbys,
# and comma-separated list of application_name
# from standby(s); '*' = all
#vacuum_defer_cleanup_age = 0   # number of xacts by which cleanup is delayed
# - Standby Servers -
# These settings are ignored on a master server.
#primary_conninfo = ''          # connection string to sending server
# (change requires restart)
#primary_slot_name = ''         # replication slot on sending server
# (change requires restart)
#promote_trigger_file = ''      # file name whose presence ends recovery
#hot_standby = on           # "off" disallows queries during recovery
# (change requires restart)
#max_standby_archive_delay = 30s    # max delay before canceling queries
# when reading WAL from archive;
# -1 allows indefinite delay
#max_standby_streaming_delay = 30s  # max delay before canceling queries
# when reading streaming WAL;
# -1 allows indefinite delay
#wal_receiver_status_interval = 10s # send replies at least this often
# 0 disables
#hot_standby_feedback = off     # send info from standby to prevent
# query conflicts
#wal_receiver_timeout = 60s     # time that receiver waits for
# communication from master
# in milliseconds; 0 disables
#wal_retrieve_retry_interval = 5s   # time to wait before retrying to
# retrieve WAL after a failed attempt
#recovery_min_apply_delay = 0       # minimum delay for applying changes during recovery
# - Subscribers -
# These settings are ignored on a publisher.
#max_logical_replication_workers = 4    # taken from max_worker_processes
# (change requires restart)
#max_sync_workers_per_subscription = 2  # taken from max_logical_replication_workers
#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------
# - Planner Method Configuration -
#enable_bitmapscan = on
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
#enable_indexonlyscan = on
#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_parallel_append = on
#enable_seqscan = on
#enable_sort = on
#enable_tidscan = on
#enable_partitionwise_join = off
#enable_partitionwise_aggregate = off
#enable_parallel_hash = on
#enable_partition_pruning = on
# - Planner Cost Constants -
#seq_page_cost = 1.0            # measured on an arbitrary scale
#random_page_cost = 4.0         # same scale as above
#cpu_tuple_cost = 0.01          # same scale as above
#cpu_index_tuple_cost = 0.005       # same scale as above
#cpu_operator_cost = 0.0025     # same scale as above
#parallel_tuple_cost = 0.1      # same scale as above
#parallel_setup_cost = 1000.0   # same scale as above
#jit_above_cost = 100000        # perform JIT compilation if available
# and query more expensive than this;
# -1 disables
#jit_inline_above_cost = 500000     # inline small functions if query is
# more expensive than this; -1 disables
#jit_optimize_above_cost = 500000   # use expensive JIT optimizations if
# query is more expensive than this;
# -1 disables
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
#effective_cache_size = 4GB
# - Genetic Query Optimizer -
#geqo = on
#geqo_threshold = 12
#geqo_effort = 5            # range 1-10
#geqo_pool_size = 0         # selects default based on effort
#geqo_generations = 0           # selects default based on effort
#geqo_selection_bias = 2.0      # range 1.5-2.0
#geqo_seed = 0.0            # range 0.0-1.0
# - Other Planner Options -
#default_statistics_target = 100    # range 1-10000
#constraint_exclusion = partition   # on, off, or partition
#cursor_tuple_fraction = 0.1        # range 0.0-1.0
#from_collapse_limit = 8
#join_collapse_limit = 8        # 1 disables collapsing of explicit
# JOIN clauses
#force_parallel_mode = off
#jit = on               # allow JIT compilation
#plan_cache_mode = auto         # auto, force_generic_plan or
# force_custom_plan
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
#log_destination = 'stderr'     # Valid values are combinations of
# stderr, csvlog, syslog, and eventlog,
# depending on platform.  csvlog
# requires logging_collector to be on.
# This is used when logging to stderr:
#logging_collector = off        # Enable capturing of stderr and csvlog
# into log files. Required to be on for
# csvlogs.
# (change requires restart)
# These are only used if logging_collector is on:
#log_directory = 'log'          # directory where log files are written,
# can be absolute or relative to PGDATA
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'    # log file name pattern,
# can include strftime() escapes
#log_file_mode = 0600           # creation mode for log files,
# begin with 0 to use octal notation
#log_truncate_on_rotation = off     # If on, an existing log file with the
# same name as the new log file will be
# truncated rather than appended to.
# But such truncation only occurs on
# time-driven rotation, not on restarts
# or size-driven rotation.  Default is
# off, meaning append to existing files
# in all cases.
#log_rotation_age = 1d          # Automatic rotation of logfiles will
# happen after that time.  0 disables.
#log_rotation_size = 10MB       # Automatic rotation of logfiles will
# happen after that much log output.
# 0 disables.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#syslog_sequence_numbers = on
#syslog_split_messages = on
# This is only relevant when logging to eventlog (win32):
# (change requires restart)
#event_source = 'PostgreSQL'
# - When to Log -
#log_min_messages = warning     # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic
#log_min_error_statement = error    # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   info
#   notice
#   warning
#   error
#   log
#   fatal
#   panic (effectively off)
#log_min_duration_statement = -1    # logs statements and their durations
# according to log_statement_sample_rate. -1 is disabled,
# 0 logs all statement, > 0 logs only statements running at
# least this number of milliseconds.
#log_statement_sample_rate = 1  # Fraction of logged statements over
# log_min_duration_statement. 1.0 logs all statements,
# 0 never logs.
# - What to Log -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_error_verbosity = default      # terse, default, or verbose messages
#log_hostname = off
#log_line_prefix = '%m [%p] '       # special values:
#   %a = application name
#   %u = user name
#   %d = database name
#   %r = remote host and port
#   %h = remote host
#   %p = process ID
#   %t = timestamp without milliseconds
#   %m = timestamp with milliseconds
#   %n = timestamp with milliseconds (as a Unix epoch)
#   %i = command tag
#   %e = SQL state
#   %c = session ID
#   %l = session line number
#   %s = session start timestamp
#   %v = virtual transaction ID
#   %x = transaction ID (0 if none)
#   %q = stop here in non-session
#        processes
#   %% = '%'
# e.g. '<%u%%%d> '
#log_lock_waits = off           # log lock waits >= deadlock_timeout
#log_statement = 'none'         # none, ddl, mod, all
#log_replication_commands = off
#log_temp_files = -1            # log temporary files equal or larger
# than the specified size in kilobytes;
# -1 disables, 0 logs all temp files
#log_timezone = 'GMT'
#------------------------------------------------------------------------------
# PROCESS TITLE
#------------------------------------------------------------------------------
#cluster_name = ''          # added to process titles if nonempty
# (change requires restart)
#update_process_title = on
#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------
# - Query and Index Statistics Collector -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none         # none, pl, all
#track_activity_query_size = 1024   # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'
# - Monitoring -
#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off
#------------------------------------------------------------------------------
# AUTOVACUUM
#------------------------------------------------------------------------------
#autovacuum = on            # Enable autovacuum subprocess?  'on'
# requires track_counts to also be on.
#log_autovacuum_min_duration = -1   # -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number
# of milliseconds.
#autovacuum_max_workers = 3     # max number of autovacuum subprocesses
# (change requires restart)
#autovacuum_naptime = 1min      # time between autovacuum runs
#autovacuum_vacuum_threshold = 50   # min number of row updates before
# vacuum
#autovacuum_analyze_threshold = 50  # min number of row updates before
# analyze
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
# (change requires restart)
#autovacuum_multixact_freeze_max_age = 400000000    # maximum multixact age
# before forced vacuum
# (change requires restart)
#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
# autovacuum, in milliseconds;
# -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
# autovacuum, -1 means use
# vacuum_cost_limit
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
# - Statement Behavior -
#client_min_messages = notice       # values in order of decreasing detail:
#   debug5
#   debug4
#   debug3
#   debug2
#   debug1
#   log
#   notice
#   warning
#   error
#search_path = '"$user", public'    # schema names
#row_security = on
#default_tablespace = ''        # a tablespace name, '' uses the default
#temp_tablespaces = ''          # a list of tablespace names, '' uses
# only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
#statement_timeout = 0          # in milliseconds, 0 is disabled
#lock_timeout = 0           # in milliseconds, 0 is disabled
#idle_in_transaction_session_timeout = 0    # in milliseconds, 0 is disabled
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
#vacuum_multixact_freeze_min_age = 5000000
#vacuum_multixact_freeze_table_age = 150000000
#vacuum_cleanup_index_scale_factor = 0.1    # fraction of total number of tuples
# before index cleanup, 0 always performs
# index cleanup
#bytea_output = 'hex'           # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_fuzzy_search_limit = 0
#gin_pending_list_limit = 4MB
# - Locale and Formatting -
#datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = 'GMT'
#timezone_abbreviations = 'Default'     # Select the set of available time zone
# abbreviations.  Currently, there are
#   Default
#   Australia (historical usage)
#   India
# You can create your own file in
# share/timezonesets/.
#extra_float_digits = 1         # min -15, max 3; any value >0 actually
# selects precise output mode
#client_encoding = sql_ascii        # actually, defaults to database
# encoding
# These settings are initialized by initdb, but they can be changed.
#lc_messages = 'C'          # locale for system error message
# strings
#lc_monetary = 'C'          # locale for monetary formatting
#lc_numeric = 'C'           # locale for number formatting
#lc_time = 'C'              # locale for time formatting
# default configuration for text search
#default_text_search_config = 'pg_catalog.simple'
# - Shared Library Preloading -
#shared_preload_libraries = ''  # (change requires restart)
#local_preload_libraries = ''
#session_preload_libraries = ''
#jit_provider = 'llvmjit'       # JIT library to use
# - Other Defaults -
#dynamic_library_path = '$libdir'
#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
#max_locks_per_transaction = 64     # min 10
# (change requires restart)
#max_pred_locks_per_transaction = 64    # min 10
# (change requires restart)
#max_pred_locks_per_relation = -2   # negative values mean
# (max_pred_locks_per_transaction
#  / -max_pred_locks_per_relation) - 1
#max_pred_locks_per_page = 2            # min 0
#------------------------------------------------------------------------------
# VERSION AND PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------
# - Previous PostgreSQL Versions -
#array_nulls = on
#backslash_quote = safe_encoding    # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#operator_precedence_warning = off
#quote_all_identifiers = off
#standard_conforming_strings = on
#synchronize_seqscans = on
# - Other Platforms and Clients -
#transform_null_equals = off
#------------------------------------------------------------------------------
# ERROR HANDLING
#------------------------------------------------------------------------------
#exit_on_error = off            # terminate session on any error?
#restart_after_crash = on       # reinitialize after backend crash?
#data_sync_retry = off          # retry or panic on failure to fsync
# data?
# (change requires restart)
#------------------------------------------------------------------------------
# CONFIG FILE INCLUDES
#------------------------------------------------------------------------------
# These options allow settings to be loaded from files other than the
# default postgresql.conf.
#include_dir = 'conf.d'         # include files ending in '.conf' from
# directory 'conf.d'
#include_if_exists = 'exists.conf'  # include file only if it exists
#include = 'special.conf'       # include file
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
# Add settings for extensions here

بس، آپ کمانڈ کے ساتھ کنٹینرز شروع کر سکتے ہیں۔ docker-compose up -d. یا کمانڈ کے ساتھ علیحدہ کنسول میں docker-compose up.

لہذا، پیکجز انسٹال ہو چکے ہیں، ڈیٹا بیس شروع کر دیا گیا ہے، بس ان کو ایک دوسرے کے ساتھ دوست بنانا باقی ہے. ایسا کرنے کے لیے، آپ کو مندرجہ ذیل فائل کو پروجیکٹ کی جڑ میں شامل کرنے کی ضرورت ہے: ormconfig.js:

ormconfig.js

const process = require('process');
const username = process.env.POSTGRES_USER || "postgres";
const password = process.env.POSTGRES_PASSWORD || "example";
module.exports = {
"type": "postgres",
"host": "localhost",
"port": 5432,
username,
password,
"database": "postgres",
"synchronize": true,
"dropSchema": false,
"logging": true,
"entities": [__dirname + "/src/**/*.entity.ts", __dirname + "/dist/**/*.entity.js"],
"migrations": ["migrations/**/*.ts"],
"subscribers": ["subscriber/**/*.ts", "dist/subscriber/**/.js"],
"cli": {
"entitiesDir": "src",
"migrationsDir": "migrations",
"subscribersDir": "subscriber"
}
}

یہ ترتیب cli typeorm کے لیے استعمال کی جائے گی۔

آئیے اس ترتیب کو مزید تفصیل سے دیکھیں۔ لائن 3 اور 4 پر ہمیں ماحولیاتی متغیرات سے صارف نام اور پاس ورڈ ملتا ہے۔ یہ اس وقت آسان ہے جب آپ کے پاس متعدد ماحول ہوں (دیو، اسٹیج، پروڈ، وغیرہ)۔ پہلے سے طے شدہ طور پر، صارف کا نام پوسٹگریس ہے اور پاس ورڈ مثال ہے۔ باقی ترتیب معمولی ہے، لہذا ہم صرف سب سے زیادہ دلچسپ پیرامیٹرز پر توجہ مرکوز کریں گے:

  • مطابقت پذیری - اشارہ کرتا ہے کہ آیا ایپلیکیشن شروع ہونے پر ڈیٹا بیس اسکیما خود بخود بن جانا چاہیے۔ اس آپشن کے ساتھ محتاط رہیں اور اسے پروڈکشن میں استعمال نہ کریں، ورنہ آپ ڈیٹا کھو دیں گے۔ ایپلیکیشن تیار کرنے اور ڈیبگ کرتے وقت یہ آپشن آسان ہے۔ اس اختیار کے متبادل کے طور پر، آپ کمانڈ استعمال کر سکتے ہیں۔ schema:sync CLI TypeORM سے۔
  • ڈراپ اسکیما - جب بھی کنکشن قائم ہوتا ہے اسکیما کو دوبارہ ترتیب دیں۔ بالکل پچھلے ایک کی طرح، یہ اختیار صرف ایپلی کیشن کی ترقی اور ڈیبگنگ کے دوران استعمال کیا جانا چاہئے.
  • ادارے - ماڈلز کی تفصیل کے لیے کون سے راستے تلاش کیے جائیں۔ براہ کرم نوٹ کریں کہ ماسک کے ذریعہ تلاش کی حمایت کی جاتی ہے۔
  • cli.entitiesDir وہ ڈائریکٹری ہے جہاں TypeORM CLI سے بنائے گئے ماڈلز کو بطور ڈیفالٹ اسٹور کیا جانا چاہیے۔

ہمارے Nest ایپلیکیشن میں TypeORM کی تمام خصوصیات کو استعمال کرنے کے قابل ہونے کے لیے، ہمیں ماڈیول درآمد کرنے کی ضرورت ہے۔ TypeOrmModule в AppModule. وہ. آپ کا AppModule اس طرح نظر آئے گا:

app.module.ts۔

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import * as process from "process";
const username = process.env.POSTGRES_USER || 'postgres';
const password = process.env.POSTGRES_PASSWORD || 'example';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username,
password,
database: 'postgres',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

جیسا کہ آپ نے دیکھا ہوگا، طریقہ forRoot ڈیٹا بیس کے ساتھ کام کرنے کے لیے وہی ترتیب منتقل کی جاتی ہے جیسا کہ ormconfig.ts فائل میں ہے۔

آخری ٹچ باقی ہے - package.json میں TypeORM کے ساتھ کام کرنے کے لیے کئی کام شامل کریں۔ حقیقت یہ ہے کہ CLI جاوا اسکرپٹ میں لکھا گیا ہے اور نوڈج ماحول میں چلتا ہے۔ تاہم، ہمارے تمام ماڈلز اور ہجرتیں ٹائپ اسکرپٹ میں لکھی جائیں گی۔ لہذا، CLI استعمال کرنے سے پہلے ہماری نقل مکانی اور ماڈلز کو نقل کرنا ضروری ہے۔ اس کے لیے ہمیں ts-node پیکیج کی ضرورت ہے:

yarn add -D ts-node

اس کے بعد، package.json میں ضروری کمانڈز شامل کریں:

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

پہلی کمانڈ، typeorm، TypeORM cli کو چلانے کے لیے ts-node wrapper کا اضافہ کرتی ہے۔ بقیہ کمانڈز آسان شارٹ کٹس ہیں جنہیں آپ، ایک ڈویلپر کے طور پر، تقریباً ہر روز استعمال کریں گے:
migration:generate - آپ کے ماڈلز میں تبدیلیوں کی بنیاد پر ہجرت کرنا۔
migration:create - ایک خالی منتقلی پیدا کرنا۔
migration:run - نقل مکانی شروع کرنا۔
ٹھیک ہے، اب یہ ہے، ہم نے ضروری پیکجز شامل کیے ہیں، ایپلیکیشن کو ڈیٹا بیس کے ساتھ کام کرنے کے لیے cli اور ایپلیکیشن سے ہی ترتیب دیا ہے، اور DBMS بھی لانچ کیا ہے۔ ہماری درخواست میں منطق شامل کرنے کا وقت آگیا ہے۔

CRUD بنانے کے لیے پیکجز انسٹال کرنا

صرف Nest کا استعمال کرتے ہوئے، آپ ایک API بنا سکتے ہیں جو آپ کو ایک ہستی بنانے، پڑھنے، اپ ڈیٹ کرنے اور حذف کرنے کی اجازت دیتا ہے۔ یہ حل ممکن حد تک لچکدار ہو گا، لیکن بعض صورتوں میں یہ بے کار ہو گا۔ مثال کے طور پر، اگر آپ کو فوری طور پر ایک پروٹو ٹائپ بنانے کی ضرورت ہے، تو آپ اکثر ترقی کی رفتار کے لیے لچک کی قربانی دے سکتے ہیں۔ بہت سے فریم ورک کسی مخصوص ہستی کے ڈیٹا ماڈل کو بیان کرکے CRUD پیدا کرنے کے لیے فعالیت فراہم کرتے ہیں۔ اور Nest کوئی استثنا نہیں ہے! یہ فعالیت پیکیج کے ذریعہ فراہم کی گئی ہے۔ @nestjsx/crud. اس کی صلاحیتیں بہت دلچسپ ہیں:

  • آسان تنصیب اور ترتیب؛
  • ڈی بی ایم ایس کی آزادی؛
  • طاقتور استفسار کی زبان جس میں فلٹر کرنے، صفحہ بندی کرنے، ترتیب دینے، رشتوں اور نیسٹڈ اداروں، کیشنگ وغیرہ کو لوڈ کرنے کی صلاحیت ہے۔
  • فرنٹ اینڈ پر درخواستیں پیدا کرنے کے لیے پیکیج؛
  • کنٹرولر طریقوں کی آسان اوور رائیڈنگ؛
  • چھوٹی ترتیب؛
  • swagger دستاویزات کی حمایت.

فعالیت کو کئی پیکجوں میں تقسیم کیا گیا ہے:

  • @nestjsx/crud - بنیادی پیکیج جو ڈیکوریٹر فراہم کرتا ہے۔ کروڈ() روٹ جنریشن، کنفیگریشن اور توثیق کے لیے؛
  • @nestjsx/crud-request - ایک پیکیج جو فرنٹ اینڈ سائیڈ پر استعمال کے لیے ایک سوال بلڈر/پارسر فراہم کرتا ہے۔
  • @nestjsx/crud-typeorm - TypeORM کے ساتھ انضمام کے لیے ایک پیکیج، ڈیٹا بیس میں موجود اداروں کے ساتھ کام کرنے کے لیے CRUD طریقوں کے ساتھ بنیادی TypeOrmCrudService سروس فراہم کرتا ہے۔

اس ٹیوٹوریل میں ہمیں پیکیجز کی ضرورت ہوگی۔ گھوںسلاjsx/crud اور گھوںسلاjsx/crud-typeorm. سب سے پہلے، آئیے انہیں ڈالتے ہیں۔

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

پیکجز کلاس ٹرانسفارمر и کلاس کی توثیق کرنے والا اس درخواست میں بالترتیب ماڈل مثالوں کو تبدیل کرنے اور آنے والی درخواستوں کی توثیق کرنے کے قواعد کی وضاحتی وضاحت کی ضرورت ہے۔ یہ پیکیج ایک ہی مصنف کے ہیں، لہذا انٹرفیس ایک جیسے ہیں۔

CRUD کا براہ راست نفاذ

ہم مثال کے طور پر صارفین کی فہرست لیں گے۔ صارفین کے پاس درج ذیل فیلڈز ہوں گے: id, username, displayName, email. id - خود بخود بڑھنے والا فیلڈ، email и username - منفرد فیلڈز۔ یہ آسان ہے! بس ہمارے خیال کو Nest ایپلی کیشن کی شکل میں نافذ کرنا باقی ہے۔
سب سے پہلے آپ کو ایک ماڈیول بنانے کی ضرورت ہے۔ users، جو صارفین کے ساتھ کام کرنے کا ذمہ دار ہوگا۔ آئیے NestJS سے cli استعمال کریں اور اپنے پروجیکٹ کی روٹ ڈائرکٹری میں کمانڈ پر عمل کریں۔ nest g module users.

نیسٹ جی ماڈیول کے صارفین

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

اس ماڈیول میں ہم ایک entities فولڈر شامل کریں گے، جہاں ہمارے پاس اس ماڈیول کے ماڈل ہوں گے۔ خاص طور پر، آئیے یہاں صارف ماڈل کی تفصیل کے ساتھ user.entity.ts فائل شامل کریں:

user.entity.ts

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: string;
@Column({unique: true})
email: string;
@Column({unique: true})
username: string;
@Column({nullable: true})
displayName: string;
}

اس ماڈل کو ہماری درخواست کے ذریعے "دیکھا" جانے کے لیے، یہ ماڈیول میں ضروری ہے۔ UsersModule درآمد TypeOrmModule مندرجہ ذیل مواد:

user.module.ts

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

یعنی یہاں ہم درآمد کرتے ہیں۔ TypeOrmModule، جہاں ایک طریقہ پیرامیٹر کے طور پر forFeature ہم اس ماڈیول سے متعلق ماڈلز کی فہرست بتاتے ہیں۔

جو کچھ باقی ہے وہ ڈیٹا بیس میں متعلقہ ادارہ بنانا ہے۔ نقل مکانی کا طریقہ کار ان مقاصد کے لیے کام کرتا ہے۔ ماڈلز میں تبدیلیوں کی بنیاد پر ہجرت بنانے کے لیے، آپ کو کمانڈ چلانے کی ضرورت ہے۔ npm run migration:generate -- CreateUserTable:

سپوئلر ٹائٹل

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

ہمیں ہجرت کو دستی طور پر لکھنے کی ضرورت نہیں تھی، سب کچھ جادوئی طور پر ہوا۔ کیا یہ معجزہ نہیں! تاہم، یہ سب نہیں ہے. آئیے تخلیق شدہ منتقلی فائل پر ایک نظر ڈالیں:

1563346135367-CreateUserTable.ts

import {MigrationInterface, QueryRunner} from "typeorm";
export class CreateUserTable1563346816726 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "user" ("id" SERIAL NOT NULL, "email" character varying NOT NULL, "username" character varying NOT NULL, "displayName" character varying, CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "UQ_78a916df40e02a9deb1c4b75edb" UNIQUE ("username"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`DROP TABLE "user"`);
}
}

جیسا کہ آپ دیکھ سکتے ہیں، نہ صرف ہجرت شروع کرنے کا طریقہ خود بخود تیار ہوا تھا، بلکہ اسے واپس لانے کا طریقہ بھی۔ لاجواب!
بس اس ہجرت کو ختم کرنا باقی ہے۔ یہ مندرجہ ذیل کمانڈ کے ساتھ کیا جاتا ہے:

npm run migration:run.

بس، اب اسکیما کی تبدیلیاں ڈیٹا بیس میں منتقل ہو گئی ہیں۔
اگلا، ہم ایک ایسی سروس بنائیں گے جو صارفین کے ساتھ کام کرنے کے لیے ذمہ دار ہو گی اور اسے وراثت میں ملے گی۔ TypeOrmCrudService. ہمارے معاملے میں، دلچسپی کی ہستی کے ذخیرے کو پیرنٹ کنسٹرکٹر کے پیرامیٹر کو منتقل کیا جانا چاہیے User ذخیرہ

user.service.ts

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

ہمیں کنٹرولر میں اس سروس کی ضرورت ہوگی۔ users. کنٹرولر بنانے کے لیے، کنسول میں ٹائپ کریں۔ nest g controller users/controllers/users

نیسٹ جی کنٹرولر صارفین/کنٹرولرز/صارفین

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

آئیے اس کنٹرولر کو کھولیں اور تھوڑا سا جادو شامل کرنے کے لیے اس میں ترمیم کریں۔ گھوںسلاjsx/crud. فی کلاس UsersController آئیے اس طرح ایک ڈیکوریٹر شامل کریں:

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

کروڈ ایک ڈیکوریٹر ہے جو کنٹرولر کو ماڈل کے ساتھ کام کرنے کے لیے ضروری طریقے شامل کرتا ہے۔ ماڈل کی قسم فیلڈ میں ظاہر کی گئی ہے۔ model.type ڈیکوریٹر کی ترتیب
دوسرا مرحلہ انٹرفیس کو نافذ کرنا ہے۔ CrudController<User>. "اسمبلڈ" کنٹرولر کوڈ اس طرح لگتا ہے:

import { Controller } from '@nestjs/common';
import { Crud, CrudController } from '@nestjsx/crud';
import { User } from '../../entities/user.entity';
import { UsersService } from '../../services/users/users.service';
@Crud({
model: {
type: User
}
})
@Controller('users')
export class UsersController implements CrudController<User>{
constructor(public service: UsersService){}
}

اور یہ سب ہے! اب کنٹرولر ماڈل کے ساتھ آپریشنز کے پورے سیٹ کو سپورٹ کرتا ہے! مجھ پر یقین نہیں ہے؟ آئیے اپنی درخواست کو عملی جامہ پہنانے کی کوشش کریں!

TestMace میں ایک استفسار اسکرپٹ بنانا

ہماری سروس کو جانچنے کے لیے ہم API کے ساتھ کام کرنے کے لیے ایک IDE استعمال کریں گے۔ ٹیسٹ میس. کیوں TestMace؟ اسی طرح کی مصنوعات کے مقابلے میں، اس کے درج ذیل فوائد ہیں:

  • متغیر کے ساتھ طاقتور کام. اس وقت، متغیرات کی کئی قسمیں ہیں، جن میں سے ہر ایک مخصوص کردار ادا کرتا ہے: بلٹ ان متغیر، متحرک متغیر، ماحولیاتی متغیر۔ ہر متغیر ایک نوڈ سے تعلق رکھتا ہے جس میں وراثت کے طریقہ کار کی حمایت ہوتی ہے۔
  • پروگرامنگ کے بغیر آسانی سے اسکرپٹس بنائیں۔ اس پر ذیل میں تبادلہ خیال کیا جائے گا؛
  • ایک انسانی پڑھنے کے قابل فارمیٹ جو آپ کو پروجیکٹ کو ورژن کنٹرول سسٹم میں محفوظ کرنے کی اجازت دیتا ہے۔
  • خودکار تکمیل، نحو کو نمایاں کرنا، متغیر قدر کو نمایاں کرنا؛
  • سویگر سے درآمد کرنے کی صلاحیت کے ساتھ API کی وضاحت کی حمایت۔

آئیے اپنے سرور کو کمانڈ کے ساتھ شروع کریں۔ npm start اور صارفین کی فہرست تک رسائی حاصل کرنے کی کوشش کریں۔ صارفین کی فہرست، ہماری کنٹرولر کنفیگریشن کے مطابق، url localhost:3000/users سے حاصل کی جا سکتی ہے۔ آئیے اس یو آر ایل سے درخواست کرتے ہیں۔
TestMace چلانے کے بعد آپ اس طرح کا انٹرفیس دیکھ سکتے ہیں:

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

اوپر بائیں طرف ایک پروجیکٹ ٹری ہے جس میں جڑ نوڈ ہے۔ پروجیکٹ. آئیے صارفین کی فہرست حاصل کرنے کے لیے پہلی درخواست بنانے کی کوشش کرتے ہیں۔ اس کے لیے ہم بنائیں گے۔ درخواست کا مرحلہ نوڈ یہ پروجیکٹ نوڈ کے سیاق و سباق کے مینو میں کیا جاتا ہے۔ نوڈ شامل کریں -> RequestStep.

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

یو آر ایل فیلڈ میں لوکل ہوسٹ:3000/صارف پیسٹ کریں اور درخواست چلائیں۔ ہمیں جوابی جسم میں خالی صف کے ساتھ کوڈ 200 موصول ہوگا۔ یہ قابل فہم ہے، ہم نے ابھی تک کسی کو شامل نہیں کیا ہے۔
آئیے ایک اسکرپٹ بنائیں جس میں درج ذیل مراحل شامل ہوں گے۔

  1. صارف بنانا؛
  2. نئے بنائے گئے صارف کی شناخت کے لیے درخواست؛
  3. مرحلہ 1 میں بنائی گئی صارف آئی ڈی کے ذریعے حذف کرنا۔

تو چلو چلتے ہیں. سہولت کے لیے، آئیے ایک نوڈ بناتے ہیں۔ فولڈر. بنیادی طور پر، یہ صرف ایک فولڈر ہے جس میں ہم پوری اسکرپٹ کو محفوظ کریں گے۔ فولڈر نوڈ بنانے کے لیے، نوڈ کے سیاق و سباق کے مینو سے پروجیکٹ کو منتخب کریں۔ نوڈ -> فولڈر شامل کریں۔. آئیے نوڈ کو کال کریں۔ چیک تخلیق. ایک نوڈ کے اندر چیک تخلیق آئیے صارف بنانے کے لیے اپنی پہلی درخواست بنائیں۔ آئیے نئے بنائے گئے نوڈ کو کال کریں۔ تخلیق کنندہ. یعنی، اس وقت نوڈ کا درجہ بندی اس طرح نظر آئے گا:

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

آئیے اوپن ٹیب پر چلتے ہیں۔ تخلیق کنندہ نوڈ آئیے درخواست کے لیے درج ذیل پیرامیٹرز درج کریں:

  • درخواست کی قسم - POST
  • URL - لوکل ہوسٹ: 3000/صارفین
  • باڈی - قدر کے ساتھ JSON {"email": "[email protected]", "displayName": "New user", "username": "user"}

آئیے اس درخواست کو پورا کریں۔ ہماری درخواست کہتی ہے کہ ریکارڈ بن گیا ہے۔

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

ٹھیک ہے، آئیے اس حقیقت کو چیک کریں۔ بعد کے مراحل میں تخلیق کردہ صارف کی شناخت کے ساتھ کام کرنے کے لیے، اس پیرامیٹر کو محفوظ کرنا ضروری ہے۔ اس کے لیے میکانزم بہترین ہے۔ متحرک متغیرات. آئیے ان کے ساتھ کام کرنے کا طریقہ دیکھنے کے لیے اپنی مثال استعمال کریں۔ جواب کے تجزیہ کردہ ٹیب میں، سیاق و سباق کے مینو میں آئی ڈی نوڈ کے آگے، آئٹم کو منتخب کریں متغیر کو تفویض کریں۔. ڈائیلاگ باکس میں آپ کو مندرجہ ذیل پیرامیٹرز کو سیٹ کرنا ہوگا:

  • نوڈ — جس میں آباؤ اجداد نے ایک متحرک متغیر بنانا ہے۔ آئیے انتخاب کرتے ہیں۔ چیک تخلیق
  • متغیر نام - اس متغیر کا نام۔ آئیے کال کرتے ہیں۔ userId.

یہاں یہ ہے کہ متحرک متغیر بنانے کا عمل کیسا لگتا ہے:

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

اب، جب بھی یہ استفسار کیا جائے گا، متحرک متغیر کی قدر کو اپ ڈیٹ کیا جائے گا۔ اور کیونکہ متحرک متغیر درجہ بندی کی وراثت، متغیر کے طریقہ کار کی حمایت کرتے ہیں۔ userId اولاد میں دستیاب ہوں گے۔ چیک تخلیق کسی بھی گھوںسلا کی سطح کا نوڈ۔
یہ متغیر اگلی درخواست میں ہمارے لیے مفید ہو گا۔ یعنی، ہم نئے بنائے گئے صارف سے درخواست کریں گے۔ ایک نوڈ کے بچے کے طور پر چیک تخلیق ہم ایک درخواست بنائیں گے چیک کریں کہ آیا موجود ہے۔ پیرامیٹر کے ساتھ url برابر localhost:3000/users/${$dynamicVar.userId}. ڈیزائن دیکھیں ${variable_name} یہ ایک متغیر کی قدر حاصل کر رہا ہے۔ کیونکہ ہمارے پاس ایک متحرک متغیر ہے، لہذا اسے حاصل کرنے کے لیے آپ کو آبجیکٹ تک رسائی حاصل کرنے کی ضرورت ہے۔ $dynamicVar، یعنی مکمل طور پر متحرک متغیر تک رسائی حاصل کرنا userId اس طرح نظر آئے گا ${$dynamicVar.userId}. آئیے درخواست پر عمل کریں اور اس بات کو یقینی بنائیں کہ ڈیٹا کی درست درخواست کی گئی ہے۔
آخری مرحلہ باقی ہے حذف کرنے کی درخواست کرنا۔ ہمیں نہ صرف حذف کرنے کے عمل کی جانچ پڑتال کرنے کی ضرورت ہے، بلکہ ڈیٹا بیس میں خود کو صاف کرنے کے لیے بھی، کیونکہ ای میل اور صارف نام کی فیلڈز منفرد ہیں۔ لہذا، چیک تخلیق نوڈ میں ہم مندرجہ ذیل پیرامیٹرز کے ساتھ حذف کرنے والے صارف کی درخواست بنائیں گے۔

  • درخواست کی قسم - حذف کریں۔
  • URL - localhost:3000/users/${$dynamicVar.userId}

چلو لانچ کرتے ہیں۔ ہم انتظار کریں. ہم نتیجہ سے لطف اندوز ہوتے ہیں)

ٹھیک ہے، اب ہم اس پوری اسکرپٹ کو کسی بھی وقت چلا سکتے ہیں۔ اسکرپٹ کو چلانے کے لیے آپ کو سیاق و سباق کے مینو سے منتخب کرنے کی ضرورت ہے۔ چیک تخلیق نوڈ آئٹم رن.

Nest, @nestjsx/crud اور TestMace کے ساتھ تیز رفتار CRUD تخلیق

اسکرپٹ میں نوڈس کو ایک کے بعد ایک عمل میں لایا جائے گا۔
آپ اس اسکرپٹ کو چلا کر اپنے پروجیکٹ میں محفوظ کر سکتے ہیں۔ فائل -> پروجیکٹ کو محفوظ کریں۔.

حاصل يہ ہوا

استعمال شدہ ٹولز کی تمام خصوصیات اس مضمون کے فارمیٹ میں فٹ نہیں ہو سکتیں۔ بنیادی مجرم کے طور پر - پیکج گھوںسلاjsx/crud - مندرجہ ذیل موضوعات بے نقاب رہتے ہیں:

  • اپنی مرضی کے مطابق توثیق اور ماڈلز کی تبدیلی؛
  • طاقتور استفسار کی زبان اور سامنے اس کا آسان استعمال؛
  • کروڈ کنٹرولرز میں نئے طریقوں کی وضاحت اور اضافہ کرنا؛
  • swagger حمایت؛
  • کیشنگ کا انتظام

تاہم، مضمون میں جو کچھ بیان کیا گیا ہے وہ بھی یہ سمجھنے کے لیے کافی ہے کہ NestJS جیسے انٹرپرائز فریم ورک میں بھی تیز رفتار ایپلیکیشن پروٹو ٹائپنگ کے لیے ٹولز موجود ہیں۔ اور ایسا ٹھنڈا IDE پسند ہے۔ ٹیسٹ میس آپ کو دی گئی رفتار کو برقرار رکھنے کی اجازت دیتا ہے۔

اس مضمون کا ماخذ کوڈ، پروجیکٹ کے ساتھ ٹیسٹ میس، ذخیرہ میں دستیاب ہے۔ https://github.com/TestMace/nest-rest. ایک پروجیکٹ کھولنے کے لیے ٹیسٹ میس بس اسے ایپ میں کریں۔ فائل -> پروجیکٹ کھولیں۔.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں