<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Lets Innovate</title><description></description><managingEditor>noreply@blogger.com (Jitendra)</managingEditor><pubDate>Tue, 27 Jan 2026 00:08:16 -0800</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">71</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://jksnu.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:keywords>Java,JSP,Java,Server,Pages,Servlets,Servlet,Hibernate,Java,Persisten,Adobe,Flex,Spring,Framework,Struts,Framework,Quartz,Scheduling,Framework,Java,Job,Scheduling,Framework,Flex,Flex3,Flex4,Flex,SDK,View,State,Cairngorm,Swiz,Parsley,Fla</itunes:keywords><itunes:summary>Hi,&#13;
I used to publish here my Research and Development works in Java and Flex here. I need your precious advices and suggestions to make it more fruitful.</itunes:summary><itunes:subtitle>Hi,&#13;
I used to publish here my Research and Development works in Java and Flex here. I need your precious advices and suggestions to make it more fruitful.</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Jitendra Kumar Singh</itunes:author><itunes:owner><itunes:email>jksnu1@gmail.com</itunes:email><itunes:name>Jitendra Kumar Singh</itunes:name></itunes:owner><item><title>Log tracing with OpenTelemetry and Jaeger:  Code Example</title><link>http://jksnu.blogspot.com/2026/01/log-tracing-with-opentelemetry-and.html</link><pubDate>Tue, 27 Jan 2026 00:08:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-3112067445445618227</guid><description>&lt;div&gt;Here, I am going to discuss about the Distributed Log Tracing in case of Microservices architecture. I have also recorded an Youtube video. Please go through the below Youtube video to get detailed information.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/fqiO_g9fN-4?si=5OUydqwBa7bGlnhq" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Problem statement:&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Suppose we have 3 services in our E-commerce application like Order, Payment and User service. Now, if user is calling Order service to create an order, then the order service is triggering the Payment service and Payment service is triggering the User service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Client -&amp;gt; Order service -&amp;gt; Payment Service -&amp;gt; User service&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, for each request, each of this 3 services is creating some logs. Suppose if some error comes and we need to debug then how can we identify which all logs are created from different microservices for a particular request. There is nothing in the logs by which we can group together the logs of a request&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Solution&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This problem can be solved by adding an unique ID for each request in all logs for that request. So, if request 1 is creating 10 logs and each of these 10 logs are having the same unique ID then we can put these 10 logs in a single group based on this unique ID and this group of logs is related to request 1. Similarly each request will generate a separate unique ID in logs for grouping the logs and associate these groups with corresponding requests.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This unique ID is basically termed as Trace ID. This trace ID can be created manually in each request and can be made propagated to each intervening microservices. But, this implementation is not Industry standard. There are few Industry recognized, well tested tool to achieve it.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of these tools is &lt;b&gt;OpenTelementry&lt;/b&gt;. OpenTelemetry generates Trace ID for each request and instrument into each request. It gathers some metrics of each request life span through out each intervening microservices. These metrics are span ID, trace ID, span duration, request flow etc. These metrics are not stored in OpenTelemetry. OpenTelemetry just gathers these information by instrumenting the requests and the export these data to some backend services like Jaeger, ELK stack (Elastic Search, Loadash, Kibana), Grafana etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here, I have implemented the open telemetry in my 3 microservices in Node.js. I am giving here the link of my GitHub repository. The technology stack I have used here are:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Node.js&lt;/div&gt;&lt;div&gt;Microservices&lt;/div&gt;&lt;div&gt;OpenTelemetry&lt;/div&gt;&lt;div&gt;Jaeger&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please go through the above Youtube video and GitHub link to get complete idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;GitHub repository&lt;/b&gt;:&amp;nbsp;https://github.com/jksnu/opentelemetry_poc.git&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/fqiO_g9fN-4/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Create VPC and Subnets in AWS CDK (Python) | Explained Step-by-Step &#128640;</title><link>http://jksnu.blogspot.com/2025/11/create-vpc-and-subnets-in-aws-cdk.html</link><pubDate>Wed, 12 Nov 2025 09:40:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-5826281424302723854</guid><description>&lt;div&gt;&lt;p data-end="667" data-start="350"&gt;In this blog, we’ll explore how to &lt;strong data-end="437" data-start="385"&gt;create a VPC and subnets using AWS CDK in Python&lt;/strong&gt;. Whether you’re new to AWS CDK or cloud networking, this post will help you understand how to set up a VPC with &lt;strong data-end="580" data-start="550"&gt;public and private subnets&lt;/strong&gt;, configure CIDR blocks correctly, and understand how AWS handles availability zones.&lt;/p&gt;
&lt;p data-end="801" data-start="669"&gt;You can also &lt;strong data-end="750" data-start="682"&gt;watch the complete hands-on tutorial on my YouTube channel here:&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/zG4nEi49oBY?si=MEmaxaucGy_jeA0M" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Understanding the VPC Basics:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A &lt;strong data-end="1252" data-start="1221"&gt;Virtual Private Cloud (VPC)&lt;/strong&gt; is your private network in AWS. It allows you to control your IP address range, create subnets, and configure route tables and gateways.&lt;/div&gt;&lt;div&gt;
&lt;p data-end="1457" data-start="1393"&gt;When you create a VPC using AWS CDK, you define the following:&lt;/p&gt;
&lt;ul data-end="1627" data-start="1458"&gt;
&lt;li data-end="1498" data-start="1458"&gt;
&lt;p data-end="1498" data-start="1460"&gt;&lt;span data-end="1474" data-start="1460"&gt;CIDR Block&lt;/span&gt; (e.g., &lt;code data-end="1495" data-start="1482"&gt;10.0.0.0/28&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end="1540" data-start="1499"&gt;
&lt;p data-end="1540" data-start="1501"&gt;&lt;span data-end="1512" data-start="1501"&gt;Subnets&lt;/span&gt; (public/private/isolated)&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end="1567" data-start="1541"&gt;
&lt;p data-end="1567" data-start="1543"&gt;&lt;span data-end="1565" data-start="1543"&gt;Availability Zones&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end="1627" data-start="1568"&gt;
&lt;p data-end="1627" data-start="1570"&gt;&lt;span data-end="1585" data-start="1570"&gt;NAT Gateway&lt;/span&gt; (if private subnets need internet access)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Setting Up the VPC Using CDK:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Here’s how you can define your VPC in CDK:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;from aws_cdk import (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; # Duration,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Stack,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; aws_ec2 as ec2,&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;div&gt;from constructs import Construct&lt;/div&gt;&lt;div&gt;import os&lt;/div&gt;&lt;br /&gt;&lt;div&gt;class AwsCdkVpcStack(Stack):&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; def __init__(self, scope: Construct, construct_id: str, **kwargs) -&amp;gt; None:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super().__init__(scope, construct_id, **kwargs)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # The code that defines your stack goes here&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.vpc = ec2.Vpc(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self, &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id=f"{os.getenv('AWS_ENV')}_{os.getenv('VPC_NAME')}",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vpc_name=os.getenv('VPC_NAME'),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cidr=os.getenv('CIDR_BLOCK'),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max_azs=2,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; create_internet_gateway=True,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nat_gateways=0, &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;subnet_configuration&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;[&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ec2.SubnetConfiguration(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=f"PublicSubnet_{os.getenv('AWS_ENV')}_{os.getenv('VPC_NAME')}_{self.region}",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subnet_type=ec2.SubnetType.PUBLIC,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cidr_mask=28,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; map_public_ip_on_launch=True&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ec2.SubnetConfiguration(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=f"PrivateSubnet_{os.getenv('AWS_ENV')}_{os.getenv('VPC_NAME')}_{self.region}",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cidr_mask=28&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ec2.SubnetConfiguration(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=f"IsolatedSubnet_{os.getenv('AWS_ENV')}_{os.getenv('VPC_NAME')}_{self.region}",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cidr_mask=28&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code inline=""&gt;cdk synth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Synthesizes your CDK code into a CloudFormation template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code inline=""&gt;cdk bootstrap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prepares your AWS environment for CDK deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code inline=""&gt;cdk deploy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploys your stack(s) to AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;GITHUB Link:&amp;nbsp;https://github.com/jksnu/aws_vpc_cdk.git&lt;/b&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/zG4nEi49oBY/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Learn AWS FREE! | Best Way to Start AWS Cloud Training (Official AWS Ski...</title><link>http://jksnu.blogspot.com/2025/10/learn-aws-free-best-way-to-start-aws.html</link><pubDate>Thu, 30 Oct 2025 00:17:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6721919515383658935</guid><description>&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/3rqyjHmPtO4?si=dtfBsQ742DWXZUFl" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p data-end="535" data-start="303"&gt;Want to start your &lt;strong data-end="352" data-start="322"&gt;AWS Cloud journey for FREE&lt;/strong&gt;? &#127785;️&lt;br data-end="360" data-start="357" /&gt;
In this video, I’ll show you how you can &lt;strong data-end="439" data-start="401"&gt;learn AWS services completely free&lt;/strong&gt; using the official &lt;strong data-end="480" data-start="459"&gt;AWS Skill Builder&lt;/strong&gt; platform — straight from Amazon Web Services itself!&lt;/p&gt;
&lt;p data-end="811" data-start="537"&gt;&#127891; &lt;strong data-end="576" data-start="540"&gt;What you’ll learn in this video:&lt;/strong&gt;&lt;br data-end="579" data-start="576" /&gt;
✅ How to access AWS Skill Builder&lt;br data-end="615" data-start="612" /&gt;
✅ Best free courses to start with (Cloud Practitioner, EC2, S3, Lambda, etc.)&lt;br data-end="695" data-start="692" /&gt;
✅ How to get AWS Cloud Practitioner Certified (with no cost!)&lt;br data-end="759" data-start="756" /&gt;
✅ Tips to learn faster and track your AWS progress&lt;/p&gt;
&lt;p data-end="899" data-start="813"&gt;&#128218; &lt;strong data-end="839" data-start="816"&gt;Start learning now:&lt;/strong&gt;&lt;br data-end="842" data-start="839" /&gt;
&#128073; &lt;a class="decorated-link cursor-pointer" data-end="897" data-start="845" rel="noopener" target="_new"&gt;https://skillbuilder.aws&lt;span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"&gt;&lt;svg class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" fill="currentColor" height="20" viewbox="0 0 20 20" width="20" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M14.3349 13.3301V6.60645L5.47065 15.4707C5.21095 15.7304 4.78895 15.7304 4.52925 15.4707C4.26955 15.211 4.26955 14.789 4.52925 14.5293L13.3935 5.66504H6.66011C6.29284 5.66504 5.99507 5.36727 5.99507 5C5.99507 4.63273 6.29284 4.33496 6.66011 4.33496H14.9999L15.1337 4.34863C15.4369 4.41057 15.665 4.67857 15.665 5V13.3301C15.6649 13.6973 15.3672 13.9951 14.9999 13.9951C14.6327 13.9951 14.335 13.6973 14.3349 13.3301Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-end="1062" data-start="901"&gt;&#128161; Whether you’re a &lt;strong data-end="933" data-start="921"&gt;beginner&lt;/strong&gt; or want to &lt;strong data-end="974" data-start="945"&gt;upgrade your cloud skills&lt;/strong&gt;, this video will help you kickstart your AWS journey without spending a single rupee!&lt;/p&gt;
&lt;p data-end="1204" data-start="1064"&gt;If you found this video helpful, don’t forget to &lt;strong data-end="1149" data-start="1113"&gt;LIKE &#128077;, SUBSCRIBE &#128276;, and SHARE&lt;/strong&gt; it with your friends who want to learn AWS for free&lt;/p&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/3rqyjHmPtO4/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Build a RAG-Based AI Chatbot with Multi-File Upload and Chroma DB (Vector DB) Integration</title><link>http://jksnu.blogspot.com/2025/09/build-rag-based-ai-chatbot-with-multi.html</link><pubDate>Sat, 13 Sep 2025 00:46:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6565050498905531680</guid><description>&lt;p&gt;&amp;nbsp;&lt;strong data-end="279" data-start="239"&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; has become a popular approach in building &lt;strong data-end="337" data-start="322"&gt;AI chatbots&lt;/strong&gt; that provide &lt;strong data-end="389" data-start="351"&gt;accurate and context-aware answers&lt;/strong&gt;. In this tutorial, we will build a &lt;strong data-end="446" data-start="425"&gt;RAG-based chatbot&lt;/strong&gt; where users can upload multiple documents (PDF, Word, etc.) to create a &lt;strong data-end="544" data-start="519"&gt;custom knowledge base&lt;/strong&gt;. When users query, the chatbot will fetch relevant context from these documents using &lt;strong data-end="644" data-start="631"&gt;Chroma DB&lt;/strong&gt; (a vector database) and provide precise answers.&lt;/p&gt;&lt;p&gt;&lt;strong data-end="750" data-start="698"&gt;Watch the full step-by-step video tutorial here:&lt;/strong&gt;&lt;br data-end="753" data-start="750" /&gt;&lt;a href="https://youtu.be/O0dHhF4q33Y" target="_blank"&gt;
&#128073; &lt;strong data-end="834" data-start="757"&gt;YouTube Video: Build RAG-Based Chatbot with Multi-File Upload + Chroma DB&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/O0dHhF4q33Y" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" data-original-height="1024" data-original-width="1536" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqIU_IqJ01J07hao_w5aPZH5I88TRu8r3bvAACK0g07EkVNNQQwgaHtFTPmZ2bxh_QQD-EFxSllNTOXm3FOI9zbsJC3DkDa6szv16oisBpwTB_TDOhmV6udhWJgXYHXMKqDbNv3K3Un-HY0yML5xLbFksXQsfflyrDoDM-XFEYDDFdbgZ2-uPwxDLHLQ8/w400-h266/thumbnail-min.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;What is RAG (Retrieval-Augmented Generation)?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p data-end="930" data-start="917"&gt;RAG combines:&lt;/p&gt;&lt;ul data-end="1105" data-start="931"&gt;
&lt;li data-end="1000" data-start="931"&gt;
&lt;p data-end="1000" data-start="933"&gt;&lt;strong data-end="946" data-start="933"&gt;Retrieval&lt;/strong&gt; → Fetches relevant information from a knowledge base.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end="1105" data-start="1001"&gt;
&lt;p data-end="1105" data-start="1003"&gt;&lt;strong data-end="1017" data-start="1003"&gt;Generation&lt;/strong&gt; → Uses an LLM (Large Language Model) like OpenAI GPT to generate context-aware answers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p data-end="1129" data-start="1107"&gt;This approach ensures:&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;


&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul data-end="1214" data-start="1130"&gt;
&lt;li data-end="1167" data-start="1130"&gt;
&lt;p data-end="1167" data-start="1132"&gt;No hallucinations (random answers).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end="1214" data-start="1168"&gt;
&lt;p data-end="1214" data-start="1170"&gt;Context-based responses from your documents.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Architecture Overview:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;User uploads documents (PDF, Word, PPT, etc.)&lt;/li&gt;&lt;li&gt;&lt;span data-end="1328" data-start="1309"&gt;Text extraction&lt;/span&gt; → Convert documents into text.&lt;/li&gt;&lt;li&gt;&lt;span data-end="1386" data-start="1363"&gt;Embeddings creation&lt;/span&gt; → Convert text into vector embeddings.&lt;/li&gt;&lt;li&gt;Store embeddings in Chroma DB&lt;/li&gt;&lt;li&gt;&lt;span data-end="1481" data-start="1467"&gt;Query flow&lt;/span&gt;:&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&lt;div style="text-align: left;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Convert user query into an embedding.&lt;/li&gt;&lt;li&gt;Fetch top N relevant chunks from Chroma DB.&lt;/li&gt;&lt;li&gt;Pass context + query to LLM for response.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhcwsEGn3flG-xEck7hnT7qobFi_v7-dIvxiIZofu04kGkdRB_8K7PzEQqQ3l53Zr2-BO6sIMhgj-DyGTJGRK1Lt4eUI6p9N0L65LCke1cjnCEsW_ca6KmRKVhw4_lSbh4jppy8iIvvXvDI4_jkEtZ0qzrGVOeh-1kf3JVeRnIqcDVP4NUALMjjg49FreQ" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="663" data-original-width="1620" height="262" src="https://blogger.googleusercontent.com/img/a/AVvXsEhcwsEGn3flG-xEck7hnT7qobFi_v7-dIvxiIZofu04kGkdRB_8K7PzEQqQ3l53Zr2-BO6sIMhgj-DyGTJGRK1Lt4eUI6p9N0L65LCke1cjnCEsW_ca6KmRKVhw4_lSbh4jppy8iIvvXvDI4_jkEtZ0qzrGVOeh-1kf3JVeRnIqcDVP4NUALMjjg49FreQ=w640-h262" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tools &amp;amp; Libraries Used:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span data-end="1672" data-start="1662"&gt;Python&lt;/span&gt; for backend&lt;/li&gt;&lt;li&gt;&lt;span data-end="1700" data-start="1687"&gt;Chroma DB&lt;/span&gt; for vector storage&lt;/li&gt;&lt;li&gt;Hugging Face LLM&lt;/li&gt;&lt;li&gt;Hugging Face Embedding Model&lt;/li&gt;&lt;li&gt;&lt;span data-end="1838" data-start="1819"&gt;Flask&lt;/span&gt; for API&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Below are the code snippet for different steps. You can go through my Youtube video to the complete detail and GitHub repository link&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Initialize Chroma DB and Create a Collection&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;chromadb&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;client&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;chromadb&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;PersistentClient&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"./chroma_db"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;collection&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;client&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get_or_create_collection&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"docs"&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Generate Embeddings:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;requests&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;typing&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;List&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logging&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"Authorization"&lt;/span&gt;: &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Bearer &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getenv&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"HUGGINGFACEHUB_API_TOKEN"&lt;/span&gt;)&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"Content-Type"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"application/json"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logging&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getLogger&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;__name__&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;EMBEDDING_MODEL&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getenv&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"EMBEDDING_MODEL"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"sentence-transformers/distilbert-base-nli-mean-tokens"&lt;/span&gt;) &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;# Function to get embedding for a given text using Hugging Face API&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;# This function assumes that the environment variable EMBEDDING_MODEL is set to a valid Hugging Face model ID&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;# Example: EMBEDDING_MODEL="sentence-transformers/distilbert-base-nli-mean-tokens"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;get_embedding&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style="color: #4ec9b0;"&gt;List&lt;/span&gt;[&lt;span style="color: #4ec9b0;"&gt;float&lt;/span&gt;]:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;url&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"https://api-inference.huggingface.co/models/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;EMBEDDING_MODEL&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;print&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"url: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;url&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;requests&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;url&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;json&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;{&lt;span style="color: #ce9178;"&gt;"inputs"&lt;/span&gt;: &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;}, &lt;span style="color: #9cdcfe;"&gt;timeout&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;60&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;verify&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;False&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;raise_for_status&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;embedding&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;embedding&lt;/span&gt; &amp;nbsp;&lt;span style="color: #6a9955;"&gt;# This is a list of floats&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;except&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Exception&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Error getting embedding: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;raise&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;ValueError&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Failed to get embedding from the model."&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Store embedded data in Chroma DB:&lt;/b&gt;&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;add_documents_to_vector_store&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;docs&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;list&lt;/span&gt;[&lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;], &lt;span style="color: #9cdcfe;"&gt;ids&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;list&lt;/span&gt;[&lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;], &lt;span style="color: #9cdcfe;"&gt;filename&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style="color: #569cd6;"&gt;None&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;vectors&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; [&lt;span style="color: #dcdcaa;"&gt;get_embedding&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;) &lt;span style="color: #c586c0;"&gt;for&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;in&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;docs&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;collection&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;add&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;documents&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;docs&lt;/span&gt;, &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;embeddings&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;vectors&lt;/span&gt;, &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;ids&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;ids&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;metadatas&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;[{&lt;span style="color: #ce9178;"&gt;"filename"&lt;/span&gt;: &lt;span style="color: #9cdcfe;"&gt;filename&lt;/span&gt;} &lt;span style="color: #c586c0;"&gt;for&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;_&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;in&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;docs&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;except&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Exception&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Error adding documents to vector store: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;raise&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;ValueError&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Failed to add documents to vector store: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;Query Chroma DB:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;query_similar_documents&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;top_k&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;int&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3&lt;/span&gt;) -&amp;gt; &lt;span style="color: #4ec9b0;"&gt;list&lt;/span&gt;[&lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;]:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;context_files&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;get_uploaded_files&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;print&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Context files available: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;context_files&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;if&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;len&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;context_files&lt;/span&gt;) &lt;span style="color: #d4d4d4;"&gt;==&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; []&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;query_vector&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;get_embedding&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;results&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;collection&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;query&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;query_embeddings&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;[&lt;span style="color: #9cdcfe;"&gt;query_vector&lt;/span&gt;], &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;n_results&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;top_k&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;where&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;{&lt;span style="color: #ce9178;"&gt;"filename"&lt;/span&gt;: {&lt;span style="color: #ce9178;"&gt;"$in"&lt;/span&gt;: &lt;span style="color: #9cdcfe;"&gt;context_files&lt;/span&gt;}}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;results&lt;/span&gt;[&lt;span style="color: #ce9178;"&gt;"documents"&lt;/span&gt;][&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;except&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Exception&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Error querying similar documents: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;raise&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;ValueError&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Failed to query similar documents: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;Combine with LLM for Answer Generation:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;requests&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logging&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;typing&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;List&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;sklearn&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;feature_extraction&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;text&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;TfidfVectorizer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;sklearn&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;metrics&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;pairwise&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;cosine_similarity&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;re&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;chromadb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;chromadb&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;config&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Settings&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;app&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;core&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;chroma_store&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;query_similar_documents&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;add_documents_to_vector_store&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;huggingface_hub&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;InferenceClient&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logging&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getLogger&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;__name__&lt;/span&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;HUGGINGFACE_API_TOKEN&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getenv&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"HUGGINGFACEHUB_API_TOKEN"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;LLM_MODEL&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getenv&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"LLM_MODEL"&lt;/span&gt;) &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;mistralai/Mixtral-8x7B-Instruct-v0.1&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"Authorization"&lt;/span&gt;: &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Bearer &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;os&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getenv&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"HUGGINGFACEHUB_API_TOKEN"&lt;/span&gt;)&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"Content-Type"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"application/json"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;build_client&lt;/span&gt;() -&amp;gt; &lt;span style="color: #4ec9b0;"&gt;InferenceClient&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;InferenceClient&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;model&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;LLM_MODEL&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;token&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;HUGGINGFACE_API_TOKEN&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;timeout&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;300&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="line-height: 19px;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;get_llm_response&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;prompt&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt;:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;client&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;build_client&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;SYSTEM_PROMPT&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"""You are a Personal assistant specialized in providing well formated answer from the context being provided."""&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;messages&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span style="color: #ce9178;"&gt;"role"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"system"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"content"&lt;/span&gt;: &lt;span style="color: #4fc1ff;"&gt;SYSTEM_PROMPT&lt;/span&gt;},&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span style="color: #ce9178;"&gt;"role"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"user"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"content"&lt;/span&gt;: &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Provide well formated answer from the given context.&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;prompt&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;result&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;client&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;chat&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;completions&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;create&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;model&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;LLM_MODEL&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;messages&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;messages&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;temperature&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;0.1&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;max_tokens&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;result&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;choices&lt;/span&gt;[&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;].&lt;span style="color: #9cdcfe;"&gt;message&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;if&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;isinstance&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;list&lt;/span&gt;):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;join&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;part&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"text"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;) &lt;span style="color: #c586c0;"&gt;if&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;isinstance&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;part&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;dict&lt;/span&gt;) &lt;span style="color: #c586c0;"&gt;else&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;part&lt;/span&gt;) &lt;span style="color: #c586c0;"&gt;for&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;part&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;in&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;text&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;except&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Exception&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;logger&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Error getting LLM response: &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;raise&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;ValueError&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Failed to get response from the LLM model."&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 data-end="3676" data-start="3648"&gt;✅ &lt;strong data-end="3676" data-start="3653"&gt;Full Video Tutorial&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;
&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p data-end="3836" data-start="3677"&gt;&#128204; &lt;a href="https://youtu.be/O0dHhF4q33Y" target="_blank"&gt;&lt;strong data-end="3747" data-start="3680"&gt;Watch the complete step-by-step guide with implementation here:&lt;/strong&gt;&lt;br data-end="3750" data-start="3747" /&gt;
&#128073; &lt;strong data-end="3816" data-start="3754"&gt;Build RAG-Based Chatbot with Multi-File Upload + Chroma DB&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/O0dHhF4q33Y" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" data-original-height="1024" data-original-width="1536" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw43oFTT10sMgVsK8_QjSR7fPwiAuffUqGWv0Vu-ck8Pzfciwqi_9heEKivzThFQwxE0sq_2Wsdq8L4wTSDmvZbPrCiuFk1bh1kpIHlMEIRxKUHFw4aWSdqxUlXpVvZWyibh7ngEeEhGX7wnaM2gQtJCZOAl_CjkvUodV__m9gq16iWMnQIv0n2zoj03g/w400-h266/thumbnail-min.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p data-end="3836" data-start="3677"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="decorated-link cursor-pointer" data-end="854" data-start="756" rel="noopener"&gt;&lt;strong data-end="834" data-start="757"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqIU_IqJ01J07hao_w5aPZH5I88TRu8r3bvAACK0g07EkVNNQQwgaHtFTPmZ2bxh_QQD-EFxSllNTOXm3FOI9zbsJC3DkDa6szv16oisBpwTB_TDOhmV6udhWJgXYHXMKqDbNv3K3Un-HY0yML5xLbFksXQsfflyrDoDM-XFEYDDFdbgZ2-uPwxDLHLQ8/s72-w400-h266-c/thumbnail-min.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Deploy AWS Lambda Using AWS CDK in Python (Step-by-Step Guide)</title><link>http://jksnu.blogspot.com/2025/09/deploy-aws-lambda-using-aws-cdk-in.html</link><pubDate>Thu, 4 Sep 2025 02:34:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6254305915633735628</guid><description>&lt;p&gt;&amp;nbsp;If you want to learn how to deploy an AWS Lambda function using the &lt;strong&gt;AWS Cloud Development Kit (CDK) in Python&lt;/strong&gt;, you’ve landed in the right place! In this post, I’ll walk you through the prerequisites, setup, and exact steps you need to follow. I’ll also share some code snippets and give a reference to my &lt;strong&gt;YouTube video tutorial&lt;/strong&gt; for better understanding.&lt;/p&gt;&lt;p&gt;&#127909; &lt;a href="https://youtu.be/EYuHG_KDeeg" target="_blank"&gt;&lt;strong&gt;Watch the complete tutorial on YouTube here:&lt;/strong&gt; AWS CDK Tutorial in Python | Deploy Lambda from S3&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/EYuHG_KDeeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" data-original-height="249" data-original-width="455" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOlHxfhZMlfziQEx_92JvhrrOvK-_TAcvredY8zuPPKVKism-bVskubZDVYnWuJuVMLDalTz5mt9N8lhd_MgjS2pnqas_wLk6oJh7nAVKzw8us-Tgo3GpWBmVtLS1A-6Hu-lFQuzApyLGwj4UL_S5hFksgo5wHt5Sf5Efa84Z_D28QFVhhUswtNfGkOBA/w400-h219/Untitled.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a disabled="true"&gt;&lt;b&gt;Prerequisites&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Before we get started, make sure you have the following ready:&lt;/p&gt;&lt;p&gt;&lt;a disabled="true"&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol data-spread="false" start="1"&gt;&lt;li&gt;&lt;p&gt;Programming Language Setup – Install Python (preferably 3.10+).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Free-tier AWS Account – Sign up at &lt;a disabled="true"&gt;AWS&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Node.js and NPM Installed – Required for CDK installation.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Steps to Deploy Lambda with AWS CDK&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Step 1)&amp;nbsp;Configure AWS CLI: Run below command on CMD and provide your AWS Access Key, Secret Key, Region and output format.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;aws configure&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 2)&amp;nbsp;Install AWS CDK: Run below NPM command to install AWS SDK globally:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="ͼ5"&gt;npm&lt;/span&gt; install &lt;span class="ͼc"&gt;-g&lt;/span&gt; aws-cdk&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 3) Verify installation: Run the below command in CMD and if it is giving correct response then installation is complete:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;cdk &lt;span class="ͼc"&gt;--version&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="ͼc"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="ͼc"&gt;Step 4)&amp;nbsp;Create a New CDK Project: Go to the folder where you want to create your project and run the below command in CMD to create CDK project structure in Python&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="ͼc"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="ͼc"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;cdk init app &lt;span class="ͼc"&gt;--language&lt;/span&gt; python&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 5)&amp;nbsp;Open Project in VSCode: Navigate into your project directory and open it in Visual Studio Code.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 6)&amp;nbsp;Add Lambda Deployment Code: In your Stack file, add the infrastructure code as follows:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;aws_cdk&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;Duration&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;Stack&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_lambda&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;_lambda&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_lambda&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_s3&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;s3&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_logs&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logs&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;RemovalPolicy&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_iam&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;iam&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_scheduler&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;scheduler&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;aws_apigateway&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;as&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;apigwv&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;CfnOutput&lt;/span&gt;&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;constructs&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Construct&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;typing&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;cast&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;class&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Hello_Lambda_CDK_Stack&lt;/span&gt;(&lt;span style="color: #4ec9b0;"&gt;Stack&lt;/span&gt;):&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;def&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;__init__&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;self&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;scope&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;Construct&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;construct_id&lt;/span&gt;: &lt;span style="color: #4ec9b0;"&gt;str&lt;/span&gt;, &lt;span style="color: #d4d4d4;"&gt;**&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;kwargs&lt;/span&gt;) -&amp;gt; &lt;span style="color: #569cd6;"&gt;None&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;super&lt;/span&gt;().&lt;span style="color: #dcdcaa;"&gt;__init__&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;scope&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;construct_id&lt;/span&gt;, &lt;span style="color: #d4d4d4;"&gt;**&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;kwargs&lt;/span&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;bucket_name&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"jitendra-lambda-bucket"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;object_key&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"mylambda.zip"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# Define a log group for the Lambda function&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_group&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;logs&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;LogGroup&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;self&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"HelloLambdaFN-LogGroup-ID"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_group_name&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"/aws/lambda/HelloLambdaFN-LogGroup"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;removal_policy&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;RemovalPolicy&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;DESTROY&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;retention&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;logs&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;RetentionDays&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;THREE_DAYS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# Define a Lambda function resource here&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;my_lambda&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;_lambda&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;Function&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;self&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"HelloLambdaFN-ID"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;runtime&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;_lambda&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;Runtime&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;PYTHON_3_13&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;handler&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"lambda_function.lambda_handler"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;code&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;_lambda&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;Code&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;from_bucket&lt;/span&gt;( &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;bucket&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;s3&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;Bucket&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;from_bucket_name&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;self&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;f&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"HelloLambdaFN-Bucket-ID"&lt;/span&gt;, &lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;bucket_name&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;key&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;object_key&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_group&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;log_group&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;timeout&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #4ec9b0;"&gt;Duration&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;seconds&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;30&lt;/span&gt;),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;memory_size&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;128&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;function_name&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"HelloLambdaFN"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# Add permissions for the Lambda function to write to the log group&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_group&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;grant_write&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;my_lambda&lt;/span&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# Define an API Gateway HTTP API to trigger the Lambda function&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;apigatewayobj&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;apigwv&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;LambdaRestApi&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;self&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"HelloLambdaFN-API-Gateway"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;rest_api_name&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"HelloLambdaFN-API"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;handler&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #dcdcaa;"&gt;cast&lt;/span&gt;(&lt;span style="color: #4ec9b0;"&gt;aws_lambda&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;IFunction&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;my_lambda&lt;/span&gt;),&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;proxy&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;True&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) &amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #4ec9b0;"&gt;CfnOutput&lt;/span&gt;(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;self&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"APIEndpoint"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;value&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;apigatewayobj&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;url&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;description&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"The endpoint URL of the HelloLambdaFN API Gateway"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Step 7)&amp;nbsp;&lt;/span&gt;Bootstrap AWS Environment:&amp;nbsp;This prepares your AWS account to use CDK.&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;cdk bootstrap&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 8)&amp;nbsp;Build Your Application (Optional):&amp;nbsp;For Python, explicit build isn’t needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 9)&amp;nbsp;Synthesize CloudFormation Template:&amp;nbsp;This generates the underlying CloudFormation template and highlight any error if there in your infrastructure code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;cdk synth&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 10)&amp;nbsp;Deploy the Stack: Run the below command in CMD and it will start creating your AWS infrastructure as per your code in step by step. Before final deployment, it will ask will confirmation and if you confirm then it will start final deployment:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;Deploy the Stack&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 11)&amp;nbsp;Delete the Application: Now, if you want to delete your deployed stack, then you can delete it by running the below CDK command:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;cdk destroy&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;With AWS CDK in Python, deploying a Lambda function directly from an S3 bucket is simple and efficient. By following these steps, you can manage your infrastructure as code and automate serverless deployments.&lt;/p&gt;&lt;p&gt;&lt;a href="https://youtu.be/EYuHG_KDeeg" target="_blank"&gt;&#128250; &lt;strong&gt;Don’t forget to watch the complete tutorial video for a practical walkthrough:&lt;/strong&gt; Click here to watch&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/EYuHG_KDeeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" data-original-height="249" data-original-width="455" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Rj9obPjANeb-NuyosgQT3VszQb7qm1kMMzKQ35451iX1chY201oaNimEFmeCFqFZMfnIBpj8-lvdNcxj0mYfDfNOHbiDKbGk7v5IxQZ1qqtX-NMJw0dQHfze2uaTT0vR2yE252DchgIrVVNKTg-TeutQbl4S_BZGcQt75Tz-z2fdMvcGM70oSALPXGs/w400-h219/Untitled.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a disabled="true"&gt;&lt;br /&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a disabled="true"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOlHxfhZMlfziQEx_92JvhrrOvK-_TAcvredY8zuPPKVKism-bVskubZDVYnWuJuVMLDalTz5mt9N8lhd_MgjS2pnqas_wLk6oJh7nAVKzw8us-Tgo3GpWBmVtLS1A-6Hu-lFQuzApyLGwj4UL_S5hFksgo5wHt5Sf5Efa84Z_D28QFVhhUswtNfGkOBA/s72-w400-h219-c/Untitled.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Microservices Communication Using Istio | Docker + Minikube Setup on Windows (Hands-on Tutorial)</title><link>http://jksnu.blogspot.com/2025/04/microservices-communication-using-istio.html</link><pubDate>Tue, 22 Apr 2025 06:13:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6801520531341262419</guid><description>&lt;p&gt;&amp;nbsp;&lt;strong data-end="288" data-start="272"&gt;Introduction&lt;/strong&gt;&lt;/p&gt;&lt;p class="" data-end="580" data-start="272"&gt;
In the ever-evolving world of microservices architecture, choosing the right way to enable service-to-service communication is key. Whether you're building an enterprise-scale solution or experimenting with distributed systems, understanding how microservices talk to each other is a must.&lt;/p&gt;
&lt;p class="" data-end="803" data-start="582"&gt;In this blog, we will explore the popular ways of microservices communication, understand the power of the Service Mesh pattern with Istio, and finally go hands-on by setting up Istio on Windows using Docker and Minikube.&lt;/p&gt;&lt;p class="" data-end="803" data-start="582"&gt;&lt;/p&gt;&lt;p class="" data-end="971" data-start="805"&gt;&#127909; &lt;strong data-end="836" data-start="808"&gt;Watch Full Tutorial Here&lt;/strong&gt;:&lt;br data-end="840" data-start="837" /&gt;
&#128073; &lt;a class="" data-end="971" data-start="843" href="https://youtu.be/l0hQ6T6rwrU" rel="noopener" target="_new"&gt;Microservices Communication Using Istio | Docker + Minikube Setup on Windows (Hands-on Tutorial)&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/l0hQ6T6rwrU" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="" data-original-height="180" data-original-width="311" height="185" src="https://blogger.googleusercontent.com/img/a/AVvXsEjr1e98a69a5B95JVB9MDC0tco2YcaUk3GolAYQTrpQ0t50jLY-LSFLE0DXRIQ0M8zn6W_unZPLBfZ8HZ74YineC_ceveOrlFPmopjxfI4LudgXi8IhJo-U4VRWndmtJsdK6-3dGZCtqM8EosuWMzY3ltIfUoCCNEBrtVxmnGEA0u0OnketJn2syo_0-ws" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p class="" data-end="1076" data-start="1022"&gt;Microservices can communicate in a few different ways:&lt;/p&gt;
&lt;ol data-end="1258" data-start="1077"&gt;
&lt;li class="" data-end="1124" data-start="1077"&gt;
&lt;p class="" data-end="1124" data-start="1080"&gt;&lt;strong data-end="1098" data-start="1080"&gt;HTTP REST APIs&lt;/strong&gt; – Most common and simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="1170" data-start="1125"&gt;
&lt;p class="" data-end="1170" data-start="1128"&gt;&lt;strong data-end="1136" data-start="1128"&gt;gRPC&lt;/strong&gt; – Efficient and high-performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="1258" data-start="1171"&gt;
&lt;p class="" data-end="1258" data-start="1174"&gt;&lt;strong data-end="1210" data-start="1174"&gt;Message Queues (Kafka, RabbitMQ)&lt;/strong&gt; – For asynchronous and decoupled communication.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="" data-end="1381" data-start="1260"&gt;However, with increasing complexity, managing this communication becomes harder — that’s where &lt;strong data-end="1371" data-start="1355"&gt;Service Mesh&lt;/strong&gt; comes in.&lt;/p&gt;&lt;p class="" data-end="1381" data-start="1260"&gt;&lt;b&gt;What is a Service Mesh?&lt;/b&gt;&lt;/p&gt;&lt;p class="" data-end="1561" data-start="1421"&gt;A &lt;strong data-end="1439" data-start="1423"&gt;Service Mesh&lt;/strong&gt; is a design pattern that provides a dedicated infrastructure layer to manage service-to-service communication. It offers:&lt;/p&gt;
&lt;ul data-end="1671" data-start="1562"&gt;
&lt;li class="" data-end="1578" data-start="1562"&gt;
&lt;p class="" data-end="1578" data-start="1564"&gt;Load balancing&lt;/p&gt;&lt;/li&gt;&lt;li class="" data-end="1578" data-start="1562"&gt;&lt;p class="" data-end="1578" data-start="1564"&gt;Service discovery&lt;/p&gt;&lt;/li&gt;
&lt;li class="" data-end="1619" data-start="1599"&gt;
&lt;p class="" data-end="1619" data-start="1601"&gt;Traffic management&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="1635" data-start="1620"&gt;
&lt;p class="" data-end="1635" data-start="1622"&gt;Observability&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="1653" data-start="1636"&gt;
&lt;p class="" data-end="1653" data-start="1638"&gt;Security (mTLS)&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="1671" data-start="1654"&gt;
&lt;p class="" data-end="1671" data-start="1656"&gt;Fault tolerance&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="" data-end="1715" data-start="1673"&gt;All without changing the application code!&lt;/p&gt;&lt;p class="" data-end="1715" data-start="1673"&gt;&lt;b&gt;Sidecar Proxy &amp;amp; Control Plane:&lt;/b&gt;&lt;/p&gt;&lt;p class="" data-end="1993" data-start="1760"&gt;The service mesh uses the &lt;strong data-end="1805" data-start="1786"&gt;Sidecar Pattern&lt;/strong&gt;, where each service instance runs alongside a proxy container (usually Envoy).&lt;br data-end="1887" data-start="1884" /&gt;
This proxy handles all the incoming and outgoing traffic, enabling advanced traffic control and telemetry.&lt;/p&gt;&lt;p class="" data-end="1715" data-start="1673"&gt;
&lt;/p&gt;&lt;p class="" data-end="2102" data-start="1995"&gt;The &lt;strong data-end="2016" data-start="1999"&gt;Control Plane&lt;/strong&gt; (like Istio) configures these proxies and coordinates their behavior across the mesh.&lt;/p&gt;&lt;h3 class="" data-end="2126" data-start="2109"&gt;Why Istio?&lt;/h3&gt;&lt;p class="" data-end="2342" data-start="2128"&gt;&lt;strong data-end="2137" data-start="2128"&gt;Istio&lt;/strong&gt; is one of the most powerful and widely-used service meshes. It simplifies observability, traffic management, and security for microservices. It works seamlessly with Kubernetes and supports features like:&lt;/p&gt;&lt;p class="" data-end="2102" data-start="1995"&gt;

&lt;/p&gt;&lt;ul data-end="2429" data-start="2343"&gt;
&lt;li class="" data-end="2360" data-start="2343"&gt;
&lt;p class="" data-end="2360" data-start="2345"&gt;Traffic shaping&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2381" data-start="2361"&gt;
&lt;p class="" data-end="2381" data-start="2363"&gt;Canary deployments&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2400" data-start="2382"&gt;
&lt;p class="" data-end="2400" data-start="2384"&gt;Circuit breakers&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2429" data-start="2401"&gt;
&lt;p class="" data-end="2429" data-start="2403"&gt;Dashboards (Kiali, Jaeger)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3 class="" data-end="2492" data-start="2436"&gt;Step-by-Step Setup (Windows + Docker + Minikube)&lt;/h3&gt;
&lt;h4 class="" data-end="2518" data-start="2494"&gt;&lt;strong data-end="2518" data-start="2501"&gt;Prerequisites&lt;/strong&gt;&lt;/h4&gt;
&lt;ol data-end="2688" data-start="2519"&gt;
&lt;li class="" data-end="2548" data-start="2519"&gt;
&lt;p class="" data-end="2548" data-start="2522"&gt;&lt;span data-end="2548" data-start="2522"&gt;Install Docker Desktop&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2587" data-start="2549"&gt;
&lt;p class="" data-end="2587" data-start="2552"&gt;&lt;span data-end="2587" data-start="2552"&gt;Set Environment Path for Docker&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2654" data-start="2588"&gt;
&lt;p class="" data-end="2654" data-start="2591"&gt;&lt;span data-end="2611" data-start="2591"&gt;Install Minikube&lt;/span&gt; (ensure virtualization support is enabled)&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2688" data-start="2655"&gt;
&lt;p class="" data-end="2688" data-start="2658"&gt;&lt;span data-end="2688" data-start="2658"&gt;Create a DockerHub account&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 class="" data-end="2732" data-start="2690"&gt;&lt;strong data-end="2732" data-start="2698"&gt;Service Mesh Setup Using Istio&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 class="" data-end="2767" data-start="2734"&gt;1. &lt;strong data-end="2767" data-start="2743"&gt;Create Microservices&lt;/strong&gt;&lt;/h5&gt;
&lt;ul data-end="2822" data-start="2768"&gt;
&lt;li class="" data-end="2784" data-start="2768"&gt;
&lt;p class="" data-end="2784" data-start="2770"&gt;User Service&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2802" data-start="2785"&gt;
&lt;p class="" data-end="2802" data-start="2787"&gt;Order Service&lt;/p&gt;
&lt;/li&gt;
&lt;li class="" data-end="2822" data-start="2803"&gt;
&lt;p class="" data-end="2822" data-start="2805"&gt;Payment Service&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;2.&amp;nbsp;&lt;b&gt;Build Docker Images&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"&gt;&lt;div style="text-align: left;"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;docker build -t user-service ./user&lt;/div&gt;&lt;div&gt;docker build -t order-service ./order&lt;/div&gt;&lt;div&gt;docker build -t payment-service ./payment&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&lt;b&gt;Push Images to DockerHub&lt;/b&gt;&lt;/p&gt;&lt;blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"&gt;&lt;p style="text-align: left;"&gt;docker push docker-hub-username/user-service&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;docker push docker-hub-username/order-service&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;docker push docker-hub-username/payment-service&lt;/p&gt;&lt;p&gt;4. &lt;b&gt;Start Minikube&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &lt;/b&gt;minikube start&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;5. &lt;b&gt;Install istio&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;istioctl install --set profile=demo -y&lt;/p&gt;&lt;p&gt;&amp;nbsp;6. &lt;b&gt;Inject Istio container as a sidecar proxy in each pod&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl label namespace default istio-injection=enabled&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;7. &lt;b&gt;Run deployment yaml files to create POD replicas&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f user-deployment.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt; kubectl apply -f order-deployment.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f payment-deployment.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp;8. &lt;b&gt;Run Istio yaml file to enable external gateway&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f istio-gateway.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp;9. &lt;b&gt;Run horizonal pod autoscaling yaml&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f order-hpa.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f payment-hpa.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f user-hpa.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp;10. &lt;b&gt;Run Circuit breaker yaml file&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl apply -f payment-cb.yaml&lt;/p&gt;&lt;p&gt;&amp;nbsp;11. &lt;b&gt;Get External IP that is exposed by Istio gateway&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;minikube tunnel&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;# In another terminal&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kubectl get svc istio-ingressgateway -n istio-system&lt;/p&gt;&lt;p&gt;&amp;nbsp;12. &lt;b&gt;Enable Observability - Optional&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;istioctl dashboard kiali&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;istioctl dashboard jaeger&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;13. Test the User API through postman with below url and input body data&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh64gTTfI4rhh82TszQOWUuBisALHu-spx2FQLumUBy_rXsxUC9B7YLlqX_4OeUYn8bEEL9s0Id6xEawPBSUexhbxfDB_KkiyVv1-u2XLnC9weQaHsl2n0jV_AYIA8gOXQKfoUFyE1I83AvYNxXMcAXc2Vdh_TFPCU1c2nh-BSKvhekvkRuv89KaXmdTew" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="281" data-original-width="652" height="173" src="https://blogger.googleusercontent.com/img/a/AVvXsEh64gTTfI4rhh82TszQOWUuBisALHu-spx2FQLumUBy_rXsxUC9B7YLlqX_4OeUYn8bEEL9s0Id6xEawPBSUexhbxfDB_KkiyVv1-u2XLnC9weQaHsl2n0jV_AYIA8gOXQKfoUFyE1I83AvYNxXMcAXc2Vdh_TFPCU1c2nh-BSKvhekvkRuv89KaXmdTew=w400-h173" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;All the code and Yaml files can be found in my below GITHUB link:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;GITHUB Repo Link:&amp;nbsp;&lt;/b&gt;https://github.com/jksnu/Service-Mesh.git&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="" data-end="4363" data-start="4202"&gt;Setting up a service mesh using Istio may seem overwhelming at first, but once done, it significantly simplifies and strengthens your microservice communication.&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;
&lt;p class="" data-end="4483" data-start="4365"&gt;If you found this blog helpful, don't forget to &lt;strong data-end="4426" data-start="4413"&gt;subscribe&lt;/strong&gt;, &lt;strong data-end="4436" data-start="4428"&gt;like&lt;/strong&gt;, and &lt;strong data-end="4451" data-start="4442"&gt;share&lt;/strong&gt; the video to help others learn!&lt;/p&gt;
&lt;p class="" data-end="4581" data-start="4485"&gt;&#128073; &lt;a class="" data-end="4581" data-start="4488" href="https://youtu.be/l0hQ6T6rwrU" rel="noopener" target="_new"&gt;&lt;b&gt;Click here to watch the complete hands-on tutorial on YouTube&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"&gt;&lt;blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://youtu.be/l0hQ6T6rwrU" style="margin-left: 1em; margin-right: 1em; text-align: center;" target="_blank"&gt;&lt;img alt="" data-original-height="180" data-original-width="311" height="185" src="https://blogger.googleusercontent.com/img/a/AVvXsEjr1e98a69a5B95JVB9MDC0tco2YcaUk3GolAYQTrpQ0t50jLY-LSFLE0DXRIQ0M8zn6W_unZPLBfZ8HZ74YineC_ceveOrlFPmopjxfI4LudgXi8IhJo-U4VRWndmtJsdK6-3dGZCtqM8EosuWMzY3ltIfUoCCNEBrtVxmnGEA0u0OnketJn2syo_0-ws" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEjr1e98a69a5B95JVB9MDC0tco2YcaUk3GolAYQTrpQ0t50jLY-LSFLE0DXRIQ0M8zn6W_unZPLBfZ8HZ74YineC_ceveOrlFPmopjxfI4LudgXi8IhJo-U4VRWndmtJsdK6-3dGZCtqM8EosuWMzY3ltIfUoCCNEBrtVxmnGEA0u0OnketJn2syo_0-ws=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Master IAM Authentication: Lambda, API Gateway, and Signature V4 in Action</title><link>http://jksnu.blogspot.com/2024/12/master-iam-authentication-lambda-api.html</link><pubDate>Sat, 28 Dec 2024 22:08:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-672955323127881741</guid><description>&lt;p&gt;&amp;nbsp;Authentication and Authorization two very important pillar of web security. Authentication is basically used to identify the user. It verifies the user is the same user that he is supposed to be. Authorization is used to verify what the user can do. What access he is having.&lt;/p&gt;&lt;p&gt;Here, I am going to discuss about the Authorization. In AWS, authorization can be implemented in 3 ways:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;IAM Auth&lt;/li&gt;&lt;li&gt;Lambda authorizer&lt;/li&gt;&lt;li&gt;Token authorizer&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;In this post, I am discussing mainly about IAM AUTH. You can go through my below Youtube video to get detailed idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;My Youtube Video Link:&amp;nbsp;https://youtu.be/QKouBNm_-BA&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://youtu.be/QKouBNm_-BA" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/a/AVvXsEiep0vxelD5QeL8y1ujZiUbnn-Yl66wugpvz3whuTmY2pVMwjb7t6R4c0rP48RkbAqBHhjY9pCnY3CJK8I3yTlPonrdRLiaklwA7csvOTh-VfiKcZniPj-XG2FnjURZb9t1YCSs1PiLfU8ueuZYadxwGbNWqThYGpW7G9_Je1g-rWBirF721Fhylflezh8=w400-h225" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I have created an youtube video on IAM Auth. Here I have shown lambda function creation, API creation, Route Creation, attaching routes with corresponding lambda functions, associating IAM auth with routes, User group creation, User creation, Policy creation and passing signature version 4 token in postman to test authorization of these routes. Below are the steps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;STEPS&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Create two lambda functions for handling two routes&lt;/li&gt;&lt;li&gt;In API Gateway - Create two routes like /helloadmin and /hellouser with GET method&lt;/li&gt;&lt;li&gt;Attach both routes with corresponding lambda functions&lt;/li&gt;&lt;li&gt;Attach each route with IAM auth for authorization&lt;/li&gt;&lt;li&gt;In IAM - Create two groups say Admin and Client&lt;/li&gt;&lt;li&gt;Create two users named as admin_user and client_user under corresponding groups&lt;/li&gt;&lt;li&gt;Create in line policy for both groups&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;The admin_user should be able to access only /helloadmin NOT /hellouser&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;    &lt;/span&gt;&lt;/span&gt;The client_user should be able to access only /hellouser NOT /helloadmin&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;8.&amp;nbsp;&amp;nbsp;Add authorization header in POSTMAN [SignatureV4]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;a) Find accesskey, secretkey, sessionToken of both users&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;	&lt;/span&gt;&amp;nbsp; &amp;nbsp; b) Pass these values in Authorization tab in POSTMAN&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;9.&amp;nbsp;&amp;nbsp;After Testing delete all Policies, Users, Groups, IAM APIs, Lambda functions&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please go through the above video where I have showed each steps in detail. It is very informative.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEiep0vxelD5QeL8y1ujZiUbnn-Yl66wugpvz3whuTmY2pVMwjb7t6R4c0rP48RkbAqBHhjY9pCnY3CJK8I3yTlPonrdRLiaklwA7csvOTh-VfiKcZniPj-XG2FnjURZb9t1YCSs1PiLfU8ueuZYadxwGbNWqThYGpW7G9_Je1g-rWBirF721Fhylflezh8=s72-w400-h225-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>PM2 vs Kubernetes : Do You Really Need Both for Your Node.js App</title><link>http://jksnu.blogspot.com/2024/11/pm2-vs-kubernetes-do-you-really-need.html</link><pubDate>Sun, 3 Nov 2024 01:11:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-7605081732024542550</guid><description>&lt;div&gt;&lt;!--StartFragment--&gt;&lt;span data-olk-copy-source="MessageBody" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt;"&gt;Today, I thought to discuss with you that Do we really need to use PM2 in Node APPLCIATION along with Kubernets. You can also go through the below recorded video on same topic in my Youtube channel:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-olk-copy-source="MessageBody" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-olk-copy-source="MessageBody" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt;"&gt;&lt;b&gt;Video link&lt;/b&gt;:&amp;nbsp;https://youtu.be/dcJ5oBCEZ8I?si=vxo0xtqdIjbHz0LY&lt;/span&gt;&lt;!--EndFragment--&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/dcJ5oBCEZ8I?si=vxo0xtqdIjbHz0LY" style="background-image: url(https://i.ytimg.com/vi/dcJ5oBCEZ8I/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div data-olk-copy-source="MessageBody" style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;PM2 provides features like&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Process management and monitoring&lt;/li&gt;&lt;li&gt;Automatic restart on failure&lt;/li&gt;&lt;li&gt;Load balancing&lt;/li&gt;&lt;li&gt;Graceful shutdown&lt;/li&gt;&lt;li&gt;Real time metrics and logging&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;span style="font-size: 12pt; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; font-weight: inherit;"&gt;All these features also provided by Kubernets along with many more. So, we can say that kubernetes is a kind of superset of PM2.&lt;/span&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;Now, it can be said that we can use PM2 in a particular pod for above mentioned feature before interference of kubernets. It's true but isn't it a kind of&amp;nbsp;&lt;span style="font-size: 12pt; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; font-weight: inherit;"&gt;feature redundancy.&lt;/span&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;Again, it can be said that PM2 can be used to initiate multiple processes in a pod to perform cpu intensive work. But again here, we can use threadpool mechanism&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;in node js to handle it.&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;So, on the whole, I am not able to find a real value of using PM2 in Node JS application along with Kubernets. But yes, in absence of kubernets, PM2 is really&amp;nbsp;&lt;span style="font-size: 12pt; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; font-weight: inherit;"&gt;very important and light weight process manager. This is my opinion. What's your thought. please mention in the comment box.&lt;/span&gt;&lt;/div&gt;&lt;div style="border: 0px; font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-feature-settings: inherit; font-kerning: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-size: 12pt; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-variation-settings: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;&lt;br style="background-color: white;" /&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/dcJ5oBCEZ8I/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Master PM2: Ultimate Guide to Node.js Process Management &amp; Optimization</title><link>http://jksnu.blogspot.com/2024/10/master-pm2-ultimate-guide-to-nodejs.html</link><pubDate>Tue, 1 Oct 2024 03:40:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6941775045926076495</guid><description>&lt;div&gt;Process Management is a very important aspect in any application configuration. There are several process management libraries. PM2 is one of them that is widely used. Here, I am showing how to use it in Windows system along with its different commands.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;IMPORTANT NOTE&lt;/b&gt;: You can get full detail in my below Youtube video. Here is the link:&amp;nbsp;&lt;b&gt;https://youtu.be/mwGV0thGBfI?si=mC7hdFg--qmaA-XT&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/mwGV0thGBfI?si=mC7hdFg--qmaA-XT" style="background-image: url(https://i.ytimg.com/vi/mwGV0thGBfI/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Benefits of Process Management libraries:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Automatic Restart&lt;/b&gt;:&amp;nbsp;If your application crashes, PM2 automatically restarts it, ensuring minimal downtime.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Load balancing:&lt;/b&gt;&amp;nbsp;PM2 can run your application in cluster mode, leveraging multi-core processors for better performance and scalability.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Process monitoring:&amp;nbsp;&lt;/b&gt;It tracks resource consumption (CPU, memory) and provides insights through monitoring tools.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Log Management: &lt;/b&gt;PM2 aggregates logs from multiple instances of your application, providing centralized logging and an easy way to debug issues.&amp;nbsp;It also allows you to view real-time logs and can be configured to send logs to external log services.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Performance Optimization:&amp;nbsp;&lt;/b&gt;PM2 allows you to run multiple instances of your application (in cluster mode), distributing the load across multiple CPU cores, improving application throughput.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Environment Management:&lt;/b&gt;&amp;nbsp;PM2 supports different environments (development, production) and allows you to define different configurations for each environment.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Memory Management:&amp;nbsp;&lt;/b&gt;PM2 provides options to set memory limits for your applications. When memory consumption exceeds the limit, it will automatically restart the app, preventing memory leaks from causing issues.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Real-time Monitoring Dashboard:&lt;/b&gt;&amp;nbsp;PM2 offers a real-time web dashboard to monitor application status, CPU, memory, and other metrics. This helps in identifying performance bottlenecks or issues in real time.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;PM2 Installation: &lt;/b&gt;We can use npm command to install PM2 at global mode by using below command:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; npm install pm2@latest -g&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Start application using PM2:&lt;/b&gt;&amp;nbsp;We can use below command to start our node js application named as Test1&lt;/div&gt;&lt;div&gt;&amp;nbsp;pm2 start C:\Personal\Jitendra\workspace\youtube\youtubeCode\app.js --name Test1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjdUH9jFrdc11SdqacOf9c6iz5CWU3FQ-AfsD0B-z1VOC1yaspKzAWz1nVbQhezNh4WjpaRywHOuvEbJ5QfHHTmrdqN5SNKOsUUkkPIS3gW3K9Ruktdgp_bP6u3fXYMeuvv-wC2QDXgzv74t3Hl2KPED-fMyG2iTnrrRnXqoc0k9dFWziMYGt7FdvN8ylE" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="162" data-original-width="793" height="81" src="https://blogger.googleusercontent.com/img/a/AVvXsEjdUH9jFrdc11SdqacOf9c6iz5CWU3FQ-AfsD0B-z1VOC1yaspKzAWz1nVbQhezNh4WjpaRywHOuvEbJ5QfHHTmrdqN5SNKOsUUkkPIS3gW3K9Ruktdgp_bP6u3fXYMeuvv-wC2QDXgzv74t3Hl2KPED-fMyG2iTnrrRnXqoc0k9dFWziMYGt7FdvN8ylE=w400-h81" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Similarly we can another node js application using PM2 on different port like:&lt;/div&gt;&lt;div&gt;pm2 start C:\Personal\Jitendra\workspace\youtube\youtubeCode2\app.js --name Test2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;List all applications: &lt;/b&gt;We can list down all applications along with their different instances running under PM2.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;pm2 list&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-x4xb1zIWiqEnu7XRS45W1kBMiwFwZ3f_kNAzAyEvRn475LlV69dWPCkHFhSdZUw2vHCg_NjEMOc1snekCcNhNNB-ShCBBVh3GArA1bjXRVef7H8qu0yYQ3DBeeB57s5WcyGf6TUAjDnD5I238XfWk-If9NW3ODEDrghgAVpAU4KSSno_sE9NavJb9bs" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="118" data-original-width="637" height="74" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-x4xb1zIWiqEnu7XRS45W1kBMiwFwZ3f_kNAzAyEvRn475LlV69dWPCkHFhSdZUw2vHCg_NjEMOc1snekCcNhNNB-ShCBBVh3GArA1bjXRVef7H8qu0yYQ3DBeeB57s5WcyGf6TUAjDnD5I238XfWk-If9NW3ODEDrghgAVpAU4KSSno_sE9NavJb9bs=w400-h74" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Monitor application:&lt;/b&gt; We can use "pm2 monit" command to open a monitor window to get the real time metrics of the applications running in PM2&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgPY5Cz_PVKONAnYrmawewSZz2HQcn33j8V8almVwji5UNfkBM5Y9g4oNLINrYDGUpTZ3khSU7Mj3fuOx4nazMtduvGP4CD5P_fDnVCJE8HqnSXiKRQRYdLQFHxrRLyUPZI03s4aydX0aLYrUUayA_MIrPDJJE2uQZvMJYgBylto_ijSBVC652OKqO8T0E" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="495" data-original-width="961" height="206" src="https://blogger.googleusercontent.com/img/a/AVvXsEgPY5Cz_PVKONAnYrmawewSZz2HQcn33j8V8almVwji5UNfkBM5Y9g4oNLINrYDGUpTZ3khSU7Mj3fuOx4nazMtduvGP4CD5P_fDnVCJE8HqnSXiKRQRYdLQFHxrRLyUPZI03s4aydX0aLYrUUayA_MIrPDJJE2uQZvMJYgBylto_ijSBVC652OKqO8T0E=w400-h206" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Watch logs: &lt;/b&gt;We can use below command to get the real time logs of our applications running under pm2&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh6l-1eYQpqD9tFHrGWV6-Bjj8QQJKfAwyYc_v-auPej49Ey9WTf2oCqPvZMdWde93wV7aZlIhvNOa7O_-shLSAoGUpACIwZlcaguN7tmk45auuNM_vDYQN4AkBDKmKc3GHqeP9JC3SwZKiXjanogTWMuSs8UGKSN4pSqDwdIbCPBVPfj9riI5PYbMjdm8" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="596" data-original-width="808" height="295" src="https://blogger.googleusercontent.com/img/a/AVvXsEh6l-1eYQpqD9tFHrGWV6-Bjj8QQJKfAwyYc_v-auPej49Ey9WTf2oCqPvZMdWde93wV7aZlIhvNOa7O_-shLSAoGUpACIwZlcaguN7tmk45auuNM_vDYQN4AkBDKmKc3GHqeP9JC3SwZKiXjanogTWMuSs8UGKSN4pSqDwdIbCPBVPfj9riI5PYbMjdm8=w400-h295" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Stop applications: &lt;/b&gt;We can use below commands to stop applications running under PM2&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; pm2 stop Test1 - stops only application named as Test1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; pm2 stop all - stops all applications running under PM2&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgV4KxBglHbSc-immvR2yv8XKE9NX2Jm65pQ_405GfGYIAQqJWAn3Pcp8HtLfdzy7bTZi1h0xgpckgnD3TJTvokeiMdV8LfYHDNep0MOkAUaGlvRMF6p4Xz0w6qiQL9p6cbkJJQz5O6OkuEVuUUYTUUmA-cnPtBv-USSLUxmPXHgOwL-xs1zEUBIC6gsSo" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="169" data-original-width="1079" height="63" src="https://blogger.googleusercontent.com/img/a/AVvXsEgV4KxBglHbSc-immvR2yv8XKE9NX2Jm65pQ_405GfGYIAQqJWAn3Pcp8HtLfdzy7bTZi1h0xgpckgnD3TJTvokeiMdV8LfYHDNep0MOkAUaGlvRMF6p4Xz0w6qiQL9p6cbkJJQz5O6OkuEVuUUYTUUmA-cnPtBv-USSLUxmPXHgOwL-xs1zEUBIC6gsSo=w400-h63" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Passing Environment variables:&lt;/b&gt;&amp;nbsp;We can pass some secure data to our application at startup time in PM2 through environment variables using below command:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;set PORT=3005 &amp;amp;&amp;amp; pm2 start C:\Personal\Jitendra\workspace\youtube\youtubeCode\app.js --name Test1&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span&gt;Here, I am passing PORT data as an environment variable at the startup time.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Ecosystem&lt;/b&gt;: we can add multiple sub-commands here for different purposes like instance handling, log handling, load balancing and thus the start command will become very complex. So, to solve this problem we can use ecosystem config file. We can automatically generate the file named as "ecosystem.config.js" using command like "pm2 ecosystem" and then we can modify the newly created file as per the application requirement:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;apps&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Test2'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;script&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'./app.js'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;NODE_ENV&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'development'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;PORT&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3006&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;watch&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'.'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }],&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;deploy&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;production&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;user&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'SSH_USERNAME'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;host&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'SSH_HOSTMACHINE'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;ref&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; &amp;nbsp;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'origin/master'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;repo&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'GIT_REPOSITORY'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'DESTINATION_PATH'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'pre-deploy-local'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'post-deploy'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt; :&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'npm install &amp;amp;&amp;amp; pm2 reload ecosystem.config.js --env production'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'pre-setup'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In this file we are passing the port and Node Env as environment variables. Similarly we can pass other variables and config parameters.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;To start the application using ecosystem.config.js, we need to use command like "pm2 start ecosystem.config.js"&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhSiaPkAkKec23bDpyxJ6MRz9oXxoYmbt4DxUVEn_0Kio94juVkQvl5dGqK1xVrGkPzpu69xXmdxfGE0i4P-A2ExeyilXTqvAwKcoNB1x9xj4bzMB0W_kvIhmrkZSC-CPbqrT-z3GijRTDvzNi-PE7bVODaTpa6XLraV8t4g7dpfQ_PL1-QTnOZHbs3xjY" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="155" data-original-width="945" height="104" src="https://blogger.googleusercontent.com/img/a/AVvXsEhSiaPkAkKec23bDpyxJ6MRz9oXxoYmbt4DxUVEn_0Kio94juVkQvl5dGqK1xVrGkPzpu69xXmdxfGE0i4P-A2ExeyilXTqvAwKcoNB1x9xj4bzMB0W_kvIhmrkZSC-CPbqrT-z3GijRTDvzNi-PE7bVODaTpa6XLraV8t4g7dpfQ_PL1-QTnOZHbs3xjY=w640-h104" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Similarly, if we want to run another application by using ecosystem.config.js file, then we have to create a separate ecosystem.config.js file and run the command "pm2 start ecosystem.config.js" with respect to this file.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;But, what if we have 100 microservices, then we have to create such 100 files for ecosystem.config.js and thus it becomes unmanageable.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;To solve this issue, we can create a single ecosystem.config.js file and we can define all the required metrics for each of the microservices in this single file and when we start it through PM2 then all microservices will start. The example of such ecosystem.config.js file is as follows:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;apps&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Test1'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;script&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'../youtube/youtubeCode/app.js'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;instances&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;2&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;max_memory_restart&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"300M"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Logging&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;out_file&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"./test1.out.log"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;error_file&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"./test1.error.log"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;merge_logs&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_date_format&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"DD-MM HH:mm:ss Z"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;log_type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"json"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;watch&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;ignore_watch&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"../youtube/youtubeCode/node_modules"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"../youtube/youtubeCode/package.json"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Env Specific Config &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;NODE_ENV&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'development'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;PORT&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3005&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Test2'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;script&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'../youtube/youtubeCode2/app.js'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;instances&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"1"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;exec_mode&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"cluster"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;out_file&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"./test2.out.log"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;error_file&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"./test2.error.log"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;watch&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;ignore_watch&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"../youtube/youtubeCode2/node_modules"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"../youtube/youtubeCode2/package.json"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;NODE_ENV&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'development'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;PORT&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3006&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;deploy&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;production&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;user&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'SSH_USERNAME'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;host&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'SSH_HOSTMACHINE'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;ref&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'origin/master'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;repo&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'GIT_REPOSITORY'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'DESTINATION_PATH'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'pre-deploy-local'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'post-deploy'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'npm install &amp;amp;&amp;amp; pm2 reload ecosystem.config.js --env production'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'pre-setup'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Please ping in the comment section if you have any question or suggestion.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/mwGV0thGBfI/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Install &amp; configure NGINX on Windows | Steps of NGINX setup on Windows</title><link>http://jksnu.blogspot.com/2024/06/install-configure-nginx-on-windows.html</link><pubDate>Fri, 14 Jun 2024 07:11:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6135446980705044148</guid><description>&lt;div&gt;Whenever we search for installation and configuration of NGINX on Windows operating system, we generally find example of Linux or Ubantu machines. So, here I am going to discuss about installation and configuration of NGINX on windows machine. Along with it, I will also discuss about how multiple applications (running on different ports on localhost) can be configured with NGINX.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have also created an Youtube video about this topic. You can go through the video to get more idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;NOTE&lt;/u&gt;&lt;/b&gt;: Link of the video:&amp;nbsp;https://youtu.be/h-NWXxyrkJ0?si=hr-_PZ29B_vbSfkC&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/h-NWXxyrkJ0?si=hr-_PZ29B_vbSfkC" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;STEPS of NGINX Installation&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Open the following URL of NGINX download website and download the zip file of latest stable version of NGINX.&amp;nbsp;&lt;/div&gt;&lt;div&gt;URL:&amp;nbsp;https://nginx.org/en/download.html&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh5KKy5Hs9P3DcwHRPvuEYSricuFaRk8N5BuXA6M2nYM9aGXV_i1yCk-yUyKI256Vjln0hj5lFcY5OaiN2yBdNNqU4icEY44_DkQptNrkk2C8MUarkBAkGXhks1SExQbllMdKqO0CBU9euMemKyTI6UX-5IT2_u7F4W-V5K3sXAMWnuY_OC1dxKkKYD5bk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="445" data-original-width="1226" height="145" src="https://blogger.googleusercontent.com/img/a/AVvXsEh5KKy5Hs9P3DcwHRPvuEYSricuFaRk8N5BuXA6M2nYM9aGXV_i1yCk-yUyKI256Vjln0hj5lFcY5OaiN2yBdNNqU4icEY44_DkQptNrkk2C8MUarkBAkGXhks1SExQbllMdKqO0CBU9euMemKyTI6UX-5IT2_u7F4W-V5K3sXAMWnuY_OC1dxKkKYD5bk=w400-h145" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;2) Unzip the file and extract the folder wherever you want to keep your NGINX folder&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEi5CDikp9AdheQduDhBuliopLoaSnO7jq5nH7hg3bWXhuarB83lyBQ7rTSy9ZducfjUt5JeS2Ms9vSbhYn-h4LkQS6nn9AFzRvZv4me__veG64HiH_nLiJEHL0Z-7yxnLgcfz1OEfH0gFjhwHxi-Qfh3_J0xGAih-hg0MzTHcxO_CoOeW_8cs3lN9q3Ut4" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="264" data-original-width="744" height="143" src="https://blogger.googleusercontent.com/img/a/AVvXsEi5CDikp9AdheQduDhBuliopLoaSnO7jq5nH7hg3bWXhuarB83lyBQ7rTSy9ZducfjUt5JeS2Ms9vSbhYn-h4LkQS6nn9AFzRvZv4me__veG64HiH_nLiJEHL0Z-7yxnLgcfz1OEfH0gFjhwHxi-Qfh3_J0xGAih-hg0MzTHcxO_CoOeW_8cs3lN9q3Ut4=w400-h143" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;3) Open CMD in Administration mode and move to the NGINX folder. In my case it is "C:\nginx-1.27.0". Then type command like "start NGINX". Open browser and type "http://localhost:80" and press Enter. Now, if below response is coming on browser then NGINX is running properly.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjj0HsJYRfWkrAN163VYpeHJrCK0TbF3_LZAq-5CyqUUD6LQG4tJKZTTMvQKtPwUmfkl9cUl0B_ZYcT7NHEw9wiGUIikus9AQU3I3H5CjJ9QqBh_e9aIgUzPFjY-zLpYWNwu0f5qIbqukE4P90w0lNHh4Rd-dsuDnte-Z7AFauYzS_gYhuQiMO7ASrmFhk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="261" data-original-width="795" height="131" src="https://blogger.googleusercontent.com/img/a/AVvXsEjj0HsJYRfWkrAN163VYpeHJrCK0TbF3_LZAq-5CyqUUD6LQG4tJKZTTMvQKtPwUmfkl9cUl0B_ZYcT7NHEw9wiGUIikus9AQU3I3H5CjJ9QqBh_e9aIgUzPFjY-zLpYWNwu0f5qIbqukE4P90w0lNHh4Rd-dsuDnte-Z7AFauYzS_gYhuQiMO7ASrmFhk=w400-h131" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgLXWF3G2lPVObnct4W_q2WxwT7bDvJxaktH-jmyZCFaA5iUW46e5sXvrTTSAxqKuqdjHXz9sj_pPxkTvR8hgYtAEvjZNCq-MYjOQp-0InyXX8DQMOPaAMZJGshSn0B6vnt2Orn9fzIeRz0Cso_2R7kGGQXI30abv4C25nl46xif6aTA3c5EiQoXkTKqBg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="124" data-original-width="277" height="179" src="https://blogger.googleusercontent.com/img/a/AVvXsEgLXWF3G2lPVObnct4W_q2WxwT7bDvJxaktH-jmyZCFaA5iUW46e5sXvrTTSAxqKuqdjHXz9sj_pPxkTvR8hgYtAEvjZNCq-MYjOQp-0InyXX8DQMOPaAMZJGshSn0B6vnt2Orn9fzIeRz0Cso_2R7kGGQXI30abv4C25nl46xif6aTA3c5EiQoXkTKqBg=w400-h179" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;We can run few more commands of NGINX as per our needs:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjjq60W2PSNCcT_5vra6JGK4XUAqGh7hozzwGT-oaK8vXHvsTOib6wc4PZBGbukMVQ__D_ZvThGPgejuQYaw5K3Q3VNP6JOfylqI20pUPLBkf3iNAfgr4cn8jySsJPbf2aYJCCgOGlEIlpKS02ab4XbJvj6fWt3xDbLa_mQF8B_nZ2xGOos_5U51AR_X_U" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="132" data-original-width="731" height="73" src="https://blogger.googleusercontent.com/img/a/AVvXsEjjq60W2PSNCcT_5vra6JGK4XUAqGh7hozzwGT-oaK8vXHvsTOib6wc4PZBGbukMVQ__D_ZvThGPgejuQYaw5K3Q3VNP6JOfylqI20pUPLBkf3iNAfgr4cn8jySsJPbf2aYJCCgOGlEIlpKS02ab4XbJvj6fWt3xDbLa_mQF8B_nZ2xGOos_5U51AR_X_U=w400-h73" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Steps of multiple application configuration on NGINX&lt;/b&gt;:&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Suppose we have two NodeJS application running in our localhost.&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;span&gt;localhost:3000/helloworld&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;localhost:3002/&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Here, if we are running these two application on browser, we are getting response. Now, we want to configure both the application in NGINX. After configuring with NGINX, we have to start both the application separately and then restart NGINX server. After this we can access both the application through NGINX in localhost on our Windows machine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Steps&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Open NGINX configuration file that is nginx.conf in Notepad or any editor:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh-oM_7L60xpXOS88R_i97yHbQE9zK-7vd0dw36xit9G4BFZntWzbRuUltDKEFoPeSbqqgq4P-UIa8mM7YlOSr8T9rzoUHjWjVMiNlpppIX0AWNTOGetPIcxTIgBDpzHG5kk9pQ4ySws-URUR1vxfeLqR7y6Wdu7qcJURGOYzDce72qCC2aauQGRye5w9U" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="257" data-original-width="645" height="160" src="https://blogger.googleusercontent.com/img/a/AVvXsEh-oM_7L60xpXOS88R_i97yHbQE9zK-7vd0dw36xit9G4BFZntWzbRuUltDKEFoPeSbqqgq4P-UIa8mM7YlOSr8T9rzoUHjWjVMiNlpppIX0AWNTOGetPIcxTIgBDpzHG5kk9pQ4ySws-URUR1vxfeLqR7y6Wdu7qcJURGOYzDce72qCC2aauQGRye5w9U=w400-h160" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;2) Add the following configuration code in http object in nginx.conf file&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;upstream test_app {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server 127.0.0.1:3000&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; upstream dev_app {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server 127.0.0.1:3002&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Add the following code in same nginx.conf file under http.server object&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;location /test/ {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_pass http://test_app/&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Host $host&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Real-IP $remote_addr&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-Proto $scheme&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; location /dev/ {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_pass http://dev_app/&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Host $host&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Real-IP $remote_addr&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-Proto $scheme&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below, is the complete nginx.conf file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;#user &amp;nbsp;nobody;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;worker_processes &amp;nbsp;1&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;#error_log &amp;nbsp;logs/error.log;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;#error_log &amp;nbsp;logs/error.log &amp;nbsp;notice;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;#error_log &amp;nbsp;logs/error.log &amp;nbsp;info;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;#pid &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logs/nginx.pid;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;events {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; worker_connections &amp;nbsp;1024&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;div&gt;http {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; include &amp;nbsp; &amp;nbsp; &amp;nbsp; mime.types&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; default_type &amp;nbsp;application/octet-stream&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#log_format &amp;nbsp;main &amp;nbsp;'$remote_addr - $remote_user [$time_local] "$request" '&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'$status $body_bytes_sent "$http_referer" '&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'"$http_user_agent" "$http_x_forwarded_for"';&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#access_log &amp;nbsp;logs/access.log &amp;nbsp;main;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; sendfile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;on&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#tcp_nopush &amp;nbsp; &amp;nbsp; on;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#keepalive_timeout &amp;nbsp;0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; keepalive_timeout &amp;nbsp;65&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#gzip &amp;nbsp;on;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; upstream test_app {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server 127.0.0.1:3000&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; upstream dev_app {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server 127.0.0.1:3002&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; server {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listen &amp;nbsp; &amp;nbsp; &amp;nbsp; 80&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server_name &amp;nbsp;localhost&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#charset koi8-r;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#access_log &amp;nbsp;logs/host.access.log &amp;nbsp;main;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; location / {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root &amp;nbsp; html&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index &amp;nbsp;index.html index.htm&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; location /test/ {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_pass http://test_app/&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Host $host&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Real-IP $remote_addr&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-Proto $scheme&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; location /dev/ {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_pass http://dev_app/&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Host $host&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Real-IP $remote_addr&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-Proto $scheme&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#error_page &amp;nbsp;404 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/404.html;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# redirect server error pages to the static page /50x.html&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error_page &amp;nbsp; 500 502 503 504 &amp;nbsp;/50x.html&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;location&lt;/span&gt; = /50x.html {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root &amp;nbsp; html&lt;span style="color: #6a9955;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# proxy the PHP scripts to Apache listening on 127.0.0.1:80&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#location ~ \.php$ {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;proxy_pass &amp;nbsp; http://127.0.0.1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#location ~ \.php$ {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; html;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;fastcgi_pass &amp;nbsp; 127.0.0.1:9000;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;fastcgi_index &amp;nbsp;index.php;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;fastcgi_param &amp;nbsp;SCRIPT_FILENAME &amp;nbsp;/scripts$fastcgi_script_name;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;include &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fastcgi_params;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# deny access to .htaccess files, if Apache's document root&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# concurs with nginx's one&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#location ~ /\.ht {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;deny &amp;nbsp;all;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# another virtual host using mix of IP-, name-, and port-based configuration&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#server {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;listen &amp;nbsp; &amp;nbsp; &amp;nbsp; 8000;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;listen &amp;nbsp; &amp;nbsp; &amp;nbsp; somename:8080;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;server_name &amp;nbsp;somename &amp;nbsp;alias &amp;nbsp;another.alias;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;location / {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;root &amp;nbsp; html;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;index &amp;nbsp;index.html index.htm;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# HTTPS server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#server {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;listen &amp;nbsp; &amp;nbsp; &amp;nbsp; 443 ssl;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;server_name &amp;nbsp;localhost;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_certificate &amp;nbsp; &amp;nbsp; &amp;nbsp;cert.pem;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_certificate_key &amp;nbsp;cert.key;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_session_cache &amp;nbsp; &amp;nbsp;shared:SSL:1m;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_session_timeout &amp;nbsp;5m;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_ciphers &amp;nbsp;HIGH:!aNULL:!MD5;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;ssl_prefer_server_ciphers &amp;nbsp;on;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;location / {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;root &amp;nbsp; html;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;index &amp;nbsp;index.html index.htm;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;# &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;#}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Test the code changes in nginx.conf file by command "nginx -t" in CMD. If the response of the command is success then its all good otherwise there is some syntax error that should be rectified before starting the NGINX server&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEg9H4lfScLHTYmArGxclOiWFoMyA5Xeo-3U6MNhiaRSt327HHJA2ZAyiud9SrbqPDKvi2ztUiMvS3qEdDGGL9fW4bZbFyA6lXeRBaDLX86mr-VRLDF9v3V7cuxLFrzwFF8GdMtL7y7QOSVw-YX-474s19YKvzqtyHT5JsbiNfEO6z_3TBFezZBJIOc3jqg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="137" data-original-width="628" height="88" src="https://blogger.googleusercontent.com/img/a/AVvXsEg9H4lfScLHTYmArGxclOiWFoMyA5Xeo-3U6MNhiaRSt327HHJA2ZAyiud9SrbqPDKvi2ztUiMvS3qEdDGGL9fW4bZbFyA6lXeRBaDLX86mr-VRLDF9v3V7cuxLFrzwFF8GdMtL7y7QOSVw-YX-474s19YKvzqtyHT5JsbiNfEO6z_3TBFezZBJIOc3jqg=w400-h88" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;5) Restart the NGINX server with command like "nginx -s reload"&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEixU83A8lI8LLUZYByqKpQyOOwRGg6pUcSbAT5VWhQgWhIYQp69_Zs6ynugyr51s3ctkKyobXhcTCVd0kM6QvrhCDpvVfqjxiNN7MO6Coy9x4mTTed1clNfxZPiXOY71OKWxLq4XcezwZjaBSvGEEKK0tumR0dLt8UhHmGiG8tMUbdDNClu-kOR52nUvZM" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="106" data-original-width="281" height="151" src="https://blogger.googleusercontent.com/img/a/AVvXsEixU83A8lI8LLUZYByqKpQyOOwRGg6pUcSbAT5VWhQgWhIYQp69_Zs6ynugyr51s3ctkKyobXhcTCVd0kM6QvrhCDpvVfqjxiNN7MO6Coy9x4mTTed1clNfxZPiXOY71OKWxLq4XcezwZjaBSvGEEKK0tumR0dLt8UhHmGiG8tMUbdDNClu-kOR52nUvZM=w400-h151" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;6) Now, access both the application in browser with url like&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use URL http://localhost/test instead of localhost:3000/helloworld&lt;/li&gt;&lt;li&gt;Use URL http://localhost/dev instead of&amp;nbsp;localhost:3002/&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgsOg2c_sntW0DSij-0Cd7fODgG7qWrXUwNrrZq730Fo6bE6-DJI0t6pPN-Nx1V3vQc4Tj2XX0uT76NijbL-YgKu_O-iCdafbpwr3auuAodQW770ifm9RLMJmrY3wUoc12Hs9UKs4Kxt-gakpRNFe4b4vfc5dFnvPL8BMtSCCttbGlnqymDFB00cbDWkvc" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="129" data-original-width="510" height="101" src="https://blogger.googleusercontent.com/img/a/AVvXsEgsOg2c_sntW0DSij-0Cd7fODgG7qWrXUwNrrZq730Fo6bE6-DJI0t6pPN-Nx1V3vQc4Tj2XX0uT76NijbL-YgKu_O-iCdafbpwr3auuAodQW770ifm9RLMJmrY3wUoc12Hs9UKs4Kxt-gakpRNFe4b4vfc5dFnvPL8BMtSCCttbGlnqymDFB00cbDWkvc=w400-h101" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEiY9E1pL_C7X6ims8PnZhgIfFUAxknQNfUYrgYoYPcE1P9etYxzM5U6E4fJB9PmW_RJjio8NDUPrxn0xV4oB9L-k_1n8_TYH64suC3TudsPYdkD0juZuk8UwWrJFJSbNshPIz-SJOGNriqr3oSzB24Jvb3Zc3xdpW4FZeOgjiiNJvbFoI2o82mD7549xfc" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="124" data-original-width="510" height="98" src="https://blogger.googleusercontent.com/img/a/AVvXsEiY9E1pL_C7X6ims8PnZhgIfFUAxknQNfUYrgYoYPcE1P9etYxzM5U6E4fJB9PmW_RJjio8NDUPrxn0xV4oB9L-k_1n8_TYH64suC3TudsPYdkD0juZuk8UwWrJFJSbNshPIz-SJOGNriqr3oSzB24Jvb3Zc3xdpW4FZeOgjiiNJvbFoI2o82mD7549xfc=w400-h98" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/h-NWXxyrkJ0/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>The Truth About Node.js: Single-Threaded or Multi-Threaded?</title><link>http://jksnu.blogspot.com/2024/05/the-truth-about-nodejs-single-threaded.html</link><pubDate>Tue, 28 May 2024 06:59:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-3888588617431333357</guid><description>&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="background-color: white; color: #0d0d0d; font-size: 16px; white-space-collapse: preserve;"&gt;Node.js is often described as single-threaded, which can be somewhat misleading. This description primarily refers to the JavaScript execution model. Node.js uses an event-driven, non-blocking I/O model, which allows it to handle many concurrent connections efficiently with a single main thread. However, this doesn't mean that Node.js can't take advantage of multiple threads. Under the hood, Node.js uses a thread pool for certain operations, and with the introduction of worker threads, Node.js can execute JavaScript code in multiple threads.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="background-color: white; color: #0d0d0d; font-size: 16px; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;NOTE&lt;/span&gt;&lt;/b&gt;: I have described it very clearly in my below Youtube video. The link of the video is &lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol" style="color: #0d0d0d;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;&lt;a href="https://youtu.be/8IDW3OQ_blQ?si=XCmM3x45nt1FRgj-" target="_blank"&gt;https://youtu.be/8IDW3OQ_blQ?si=XCmM3x45nt1FRgj-&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/8IDW3OQ_blQ?si=XCmM3x45nt1FRgj-" style="background-image: url(https://i.ytimg.com/vi/8IDW3OQ_blQ/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h4 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; line-height: 1.5; margin: 1rem 0px 0.5rem; white-space-collapse: preserve;"&gt;Understanding the Single-Threaded Nature&lt;/h4&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;Node.js runs JavaScript code in a single thread. This means that all JavaScript code execution happens in a single call stack, and operations are executed one at a time. This is efficient for I/O-bound tasks, where the main thread can offload tasks like file I/O or network requests to the system's underlying non-blocking capabilities and continue executing other JavaScript code.&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;Below is the example code where I have created two routes:&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3002&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/nonblocking'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"This is non blocking api"&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/blocking'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;for&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;let&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;99999999999999&lt;/span&gt;; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;++&lt;/span&gt;) { &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"This is blocking api"&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;/div&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;Here, the route '/nonblocking' is very simple and light route where I am just returning a string in response and it is taking just few millisecond to return the response. But, in the 2nd route '/blocking', I am traversing a very big loop that is taking several minutes. Now, if any user is calling this route, then the main thread gets blocked in processing this request and it is not available to other request and thus even "/nonblocking" routes are also waiting until the "/blocking" routes gets processed completely. To solve, this issue, I have used worker thread in my below code.&lt;/p&gt;&lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; white-space-collapse: preserve;"&gt;Example of Worker Threads&lt;/h3&gt;&lt;div&gt;&lt;b&gt;App.js&lt;/b&gt;: Here, I am creating a thread:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3002&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/nonblocking'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"This is non blocking api"&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/blocking'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4ec9b0;"&gt;Worker&lt;/span&gt; } &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'worker_threads'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;worker&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Worker&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'./worker.js'&lt;/span&gt;, &amp;nbsp;{&lt;span style="color: #9cdcfe;"&gt;workerData&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;999999&lt;/span&gt;} );&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;worker&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'message'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"This is blocking api with data = "&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;+&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;worker&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'error'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;worker&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'exit'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;code&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;if&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;code&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;!==&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;reject&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Worker stopped with exit code &lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;code&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;));&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }) &amp;nbsp;&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;Here, the line &lt;span style="background-color: #1f1f1f; color: #569cd6; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;const&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt; &lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #4fc1ff; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;worker&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt; &lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;=&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt; &lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #569cd6; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;new&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt; &lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #4ec9b0; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;Worker&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #ce9178; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;'./worker.js'&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;, &amp;nbsp;{&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #9cdcfe; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;workerData&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #9cdcfe; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;:&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt; &lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #b5cea8; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;999999&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;} );&lt;/span&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;is basically creating a new thread. This thread is emitting events like message, error and exit. We should listen these event to process the data accordingly.&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;&lt;b&gt;worker.js : &lt;/b&gt;Here, we are basically, defining the logic of the task that this thread must perform and once task is completed then it will publish the resultant data by parentPort.postMessage(data);&lt;/p&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4fc1ff;"&gt;parentPort&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;workerData&lt;/span&gt; } &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'worker_threads'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;countTo&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;number&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;let&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;count&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;for&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;let&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;number&lt;/span&gt;; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;&lt;span style="color: #d4d4d4;"&gt;++&lt;/span&gt;) { &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;count&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;count&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;+&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;i&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;count&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;countTo&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;workerData&lt;/span&gt;);&lt;/div&gt;&lt;/div&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space-collapse: preserve;"&gt;&lt;span style="background-color: #1f1f1f; color: #4fc1ff; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;parentPort&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;.&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #dcdcaa; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;postMessage&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #4fc1ff; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;result&lt;/span&gt;&lt;span style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; text-wrap: nowrap;"&gt;);&lt;/span&gt; &lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; margin: 0px 0px 1.25em;"&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="font-size: 20px; white-space-collapse: preserve;"&gt;&lt;b&gt;Pros and Cons of Using Worker Threads

Pros:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; margin: 0px 0px 1.25em;"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Improved Performance for CPU-bound Tasks&lt;/b&gt;: Worker threads can significantly improve the performance of CPU-bound tasks by offloading them to separate threads.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Parallel Execution&lt;/b&gt;: Allows for true parallel execution of JavaScript code, which can lead to more efficient use of multi-core processors.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Enhanced Application Responsiveness&lt;/b&gt;: By handling heavy computations in worker threads, the main thread remains responsive to I/O operations and user interactions.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; margin: 0px 0px 1.25em;"&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Cons&lt;/b&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; margin: 0px 0px 1.25em;"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Complexity&lt;/b&gt;: Introducing multi-threading can add complexity to the codebase, making it harder to understand and maintain.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Shared Memory Concerns&lt;/b&gt;: While worker threads can share memory using SharedArrayBuffer, managing shared memory can be tricky and prone to errors.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Overhead&lt;/b&gt;: Creating and managing worker threads introduces some overhead, which might not be justified for small or simple tasks.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;When to Use Worker Threads in Node.js&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;Worker threads are particularly useful in the following scenarios:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;CPU-bound Tasks&lt;/b&gt;: Any task that requires significant CPU time, such as complex calculations, image processing, or data parsing, can benefit from being executed in worker threads.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Parallel Processing&lt;/b&gt;: Tasks that can be divided into smaller, independent sub-tasks and executed in parallel will see performance gains.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Offloading Intensive Tasks&lt;/b&gt;: Tasks that could block the event loop, such as large file processing, can be offloaded to worker threads to keep the main thread responsive.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #0d0d0d; font-family: ui-sans-serif, -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica, Apple Color Emoji, Arial, Segoe UI Emoji, Segoe UI Symbol;"&gt;&lt;span style="white-space-collapse: preserve;"&gt;&lt;b&gt;Real-time Applications&lt;/b&gt;: Applications that require real-time processing and cannot afford to have the main thread blocked will benefit from using worker threads.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Node.js is fundamentally single-threaded for JavaScript execution, but it can utilize multiple threads for certain operations and with the introduction of worker threads. This dual capability allows developers to handle both I/O-bound and CPU-bound tasks efficiently. By understanding when and how to use worker threads, developers can optimize their Node.js applications for better performance and responsiveness.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/8IDW3OQ_blQ/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Deploying Your Node.js App on EC2 (Amazon Web Services) with PM2 and NGINX</title><link>http://jksnu.blogspot.com/2024/05/deploying-your-nodejs-app-on-ec2-amazon.html</link><pubDate>Sun, 26 May 2024 04:04:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-1323244668765365153</guid><description>&lt;div&gt;In this blog, I am going to discuss about how to deploy your Node JS and Express application in AWS EC2 instance. Along with deploying the application I am also setting up the NGINX server and PM2 (Process Manager) library. I have shown all these steps clearly in this Youtube video. Please go through the video to get the complete and clear idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;NOTE&lt;/b&gt;:&amp;nbsp;&lt;span style="color: #222222; font-size: 13.2px;"&gt;The URL of this video:&amp;nbsp;&lt;b&gt;https://youtu.be/z0GkpPYwl8o&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/z0GkpPYwl8o?si=yWK2AkxXFfz3wQkl" style="background-image: url(https://i.ytimg.com/vi/z0GkpPYwl8o/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Steps&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1)&amp;nbsp;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Create your free trial AWS login&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;2) &lt;/span&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Commit your code to GitHub&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;3) &lt;/span&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Create EC2 instance:&lt;/span&gt;&lt;span face="Roboto, Arial, sans-serif" style="color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span face="Roboto, Arial, sans-serif" style="color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Create an EC2 instance. Basically t2-micro ubuntu&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Connect to your EC2 instance&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;Trigger sudo apt update to install any update if available&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;4) Install node js version 18:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;sudo apt install nodejs&lt;/li&gt;&lt;li&gt;node -v&lt;/li&gt;&lt;li&gt;npm -v &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;5) Verify if GIT and clone your project : &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;git --version&lt;/li&gt;&lt;li&gt;git clone YOUR_PROJECT_REPOSITORY_URL&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;6) Project configuration:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Go inside your project folder: cd youtubeCode&lt;/li&gt;&lt;li&gt;Trigger command "npm install" to create the node_module folder&lt;/li&gt;&lt;li&gt;Verify node_module folder by command "ls"&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;7) Install Process Manager(PM2) library at global level&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;sudo npm install -g pm2&lt;/li&gt;&lt;li&gt;Then go to your project folder&lt;/li&gt;&lt;li&gt;pm2 start app.js&lt;/li&gt;&lt;li&gt;pm2 logs &lt;/li&gt;&lt;li&gt;pm2 reload all&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;8) Now you can visit your api in browser: http://IP:Port/routeName&lt;/div&gt;&lt;/div&gt;&lt;div&gt;9) Install nginx and configure:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;sudo apt install nginx&lt;/li&gt;&lt;li&gt;sudo vim etc/nginx/sites-available/default andthen add below configs in this default file&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;&lt;div&gt;&lt;div&gt;server_name 54.206.158.160;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;  location / {&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;   proxy_pass http://localhost:3001;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;   proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;          proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;          proxy_set_header Connection 'upgrade';&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;          proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;          proxy_cache_bypass $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;  }&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;&lt;span face="Roboto, Arial, sans-serif" style="background-color: rgba(0, 0, 0, 0.05); color: #131313; font-size: 14px; white-space-collapse: preserve;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Press ctrl+c and type :wq! to write and quit&lt;/li&gt;&lt;li&gt;Check NGINX config by command "sudo nginx -t". If it is returning success that means your NGINX server is configured properly and you can run your application on your NGINX server.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;10) Start your NGINX server: sudo systemctl stop nginx&lt;/div&gt;&lt;div&gt;11) If any changes are being done in NGINX configuration, then you have to restart your NGINX server by command like sudo systemctl start nginx&lt;/div&gt;&lt;div&gt;12) If all steps are being followed properly, then till here, your application will be deployed and running successfully on NGINX server using PM2 library on AWS EC2 instance and now you can access your API just by using your EC2 instance's public IP address. No need to provide the port number. By default NGINX is running on PORT 80 and security group of EC2 instance in AWS is already having inbound rule to allow the traffic from 80 port.&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/z0GkpPYwl8o/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Create AWS RDS DB | Connect localhost with RDS DB </title><link>http://jksnu.blogspot.com/2024/05/create-aws-rds-db-connect-localhost.html</link><pubDate>Sun, 26 May 2024 03:27:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-3136383303474771825</guid><description>&lt;div&gt;Here, I am trying to create a database in RDS in AWS (Amazon Web Services). Below are the steps that should be followed:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Create a free account in AWS&lt;/li&gt;&lt;li&gt;Go to RDS and create a DB as shown in below video&lt;/li&gt;&lt;li&gt;Utilize the DB URL in API to create database connection.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;u&gt;&lt;span style="font-family: verdana; font-size: large;"&gt;NOTE&lt;/span&gt;&lt;span style="font-family: verdana; font-size: medium;"&gt;:&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;&amp;nbsp;I have described all the steps in my Youtube video. You can follow it on Youtube for better understanding.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #222222; font-size: 13.2px;"&gt;The URL of this video: &lt;b&gt;https://youtu.be/fj3gCZ9bTOo&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/fj3gCZ9bTOo?si=LpeovB0cp9bCcEha" style="background-image: url(https://i.ytimg.com/vi/fj3gCZ9bTOo/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below is the code where I am creating a connection with AWS RDS DB in the file model/index.js. This index.js file is being used in schema file model/user.js. This schema file is being used in service/user.js.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhBazHUBKASkw7rbTwQNwtIxR3maYS1cmt9M9JAuqiMaFYkR21wu9VxCfitfP4REWDAreJg9ooQUERa1vemvAcDYWzfanDiAYDtXTPmTIucewEzFEBFHTtZTOVIZe6flT9SnYWp5MMnPmLGTuN0j5QazczPtwiW0WBhEqSlLj5hrUENSQgiwpper7ne21Y" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="358" data-original-width="307" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhBazHUBKASkw7rbTwQNwtIxR3maYS1cmt9M9JAuqiMaFYkR21wu9VxCfitfP4REWDAreJg9ooQUERa1vemvAcDYWzfanDiAYDtXTPmTIucewEzFEBFHTtZTOVIZe6flT9SnYWp5MMnPmLGTuN0j5QazczPtwiW0WBhEqSlLj5hrUENSQgiwpper7ne21Y" width="206" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;model/index.js -&lt;/b&gt; Here, I am establishing connection with AWS RDS DB.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;DataTypes&lt;/span&gt; } &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'sequelize'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Initialize Sequelize connection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'testdb'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'username'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'password'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;host&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'testdb.sdjkweurowdsj.ap-southeast-2.rds.amazonaws.com'&lt;/span&gt;, //It is Dummy hostname&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;dialect&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'mysql'&lt;/span&gt;, &lt;span style="color: #6a9955;"&gt;// Specify the dialect (in this case, MySQL)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;operationsAliases&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;pool&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;max&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;5&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;min&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;acquire&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;30000&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;idle&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;10000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;User&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'./user'&lt;/span&gt;)(&lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;module&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;exports&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Close Sequelize connection when the Node.js process exits&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'exit'&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Handle Ctrl+C or SIGINT signal to gracefully close the connection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'SIGINT'&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Handle uncaught exceptions and promise rejections&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'uncaughtException'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'unhandledRejection'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;reason&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;promise&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Sequelize Schema file : model/user.js&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;UserModel&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;define&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'User'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;INTEGER&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;primaryKey&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;autoIncrement&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;STRING&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;allowNull&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;email&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;STRING&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;allowNull&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; }, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;tableName&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'users'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;timestamps&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt; &lt;span style="color: #6a9955;"&gt;// If your table doesn't have timestamp fields (createdAt, updatedAt)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;UserModel&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Service file: service/user.js&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; {&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt;: {&lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;}} &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../model'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; () {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;findAll&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;userObj&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;create&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;userObj&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;destroy&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"where"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;span style="color: #ce9178;"&gt;"id"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;}});&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; &lt;span style="color: #d4d4d4;"&gt;=&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/fj3gCZ9bTOo/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Create your chat bot in 10 min by using CHATGPT</title><link>http://jksnu.blogspot.com/2024/05/create-your-chat-bot-in-10-min-by-using.html</link><pubDate>Sun, 26 May 2024 02:49:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-3146926265714464117</guid><description>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;I am going to show here how easily we can develop our chatbot with in few minutes using ChatGPT API.&amp;nbsp;&lt;/span&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;Here, I am using followings:&lt;/span&gt;&lt;/div&gt;&lt;p style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;/p&gt;&lt;ol style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;ReactJs for creating user front end&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;NodeJs for server api interacting with ChatGPT API&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;ChatGPT API&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #222222;"&gt;&lt;span&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family: verdana; font-size: large;"&gt;NOTE&lt;/span&gt;&lt;span style="font-family: verdana; font-size: medium;"&gt;:&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style="font-size: 13.2px;"&gt; I have described all the steps in my Youtube video also. You can follow it on Youtube for better understanding. The URL of this video:&amp;nbsp;&lt;b&gt;https://youtu.be/zbZfoT3eXmM&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/zbZfoT3eXmM?si=gn1QzdqWtDjPoNRK" style="background-image: url(https://i.ytimg.com/vi/zbZfoT3eXmM/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;Here, we have to complete 3 tasks:&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;Task 1: Create your ChatGPT API secret key to be used in your code. You need to follow below steps:&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;ol&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Open the url&amp;nbsp;https://openai.com/ and login here using your Google Id or create your own login Id and password.&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Create your ChatGPT secret key by clicking on the "Create new Secret key" in the url given in below screenshot. Copy and paste this key in your notepad file. You will not be able to retrieve it again.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjxgXilkzIM8ipBfAp5qfoG3930sucnZSRbOrsRdY9o-W6P1iXEmxbEUQ9sOUrVhBW89zNAtDjPzzcBdiHN7XTjNfzHGDV2vKUt0J65iNqgdU9ePTBGnfBQzSKt4u1bniVOsxlfJDPGuk5JdRJMx4UXIw8FlrW6uLw5c7UzT2bsGPJpoj-QkHOWKQdn" style="color: #2288bb; margin-left: 1em; margin-right: 1em; text-decoration-line: none;"&gt;&lt;img alt="" data-original-height="437" data-original-width="1176" height="175" src="https://blogger.googleusercontent.com/img/a/AVvXsEjxgXilkzIM8ipBfAp5qfoG3930sucnZSRbOrsRdY9o-W6P1iXEmxbEUQ9sOUrVhBW89zNAtDjPzzcBdiHN7XTjNfzHGDV2vKUt0J65iNqgdU9ePTBGnfBQzSKt4u1bniVOsxlfJDPGuk5JdRJMx4UXIw8FlrW6uLw5c7UzT2bsGPJpoj-QkHOWKQdn=w472-h175" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 1px solid rgb(238, 238, 238); box-shadow: rgba(0, 0, 0, 0.1) 1px 1px 5px; padding: 5px; position: relative;" width="472" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Task2: Create Node Js api: Here, we should follow the below steps:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Install NodeJs and NPM&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Create a node js project by command npm init -y&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Install express and axios dependencies.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"chatnode"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"1.0.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"description"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"main"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"index.js"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"echo &lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;Error: no test specified&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"author"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"Jitendra Kumar Singh"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"license"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"ISC"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"axios"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"express"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^4.18.2"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Create a new file server.js file where you will define port, start server and create api for interacting with ChatGPT api&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;axios&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'axios'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; = &lt;span style="color: #b5cea8;"&gt;3001&lt;/span&gt;; &lt;span style="color: #6a9955;"&gt;// Set your desired port number&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;header&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Access-Control-Allow-origin"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"http://localhost:3000"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;setHeader&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"GET,POST,OPTIONS"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;header&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Access-Control-Allow-Headers"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"Origin, X-Requested-With, Content-Type, Accept"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;})&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Middleware to parse JSON request bodies&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;());&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// POST endpoint to handle user queries&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/api/query'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt; } = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Make a POST request to the ChatGPT API&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;axios&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'https://api.openai.com/v1/chat/completions'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;model&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'gpt-3.5-turbo'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;messages&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; [{ &lt;span style="color: #9cdcfe;"&gt;role&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'system'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'You are a helpful assistant.'&lt;/span&gt; }, { &lt;span style="color: #9cdcfe;"&gt;role&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'user'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt; }],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'Authorization'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Bearer YOUR_CHATGPT_API_SECRET_KEY'&lt;/span&gt;, &lt;span style="color: #6a9955;"&gt;// Replace with your ChatGPT API key&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'Content-Type'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'application/json'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({ &lt;span style="color: #9cdcfe;"&gt;reply&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;choices&lt;/span&gt;[&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;].&lt;span style="color: #9cdcfe;"&gt;message&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;500&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({ &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'An error occurred while processing the request.'&lt;/span&gt; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Start the server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;5) Start your node js server by npm start&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;Task 3: Create ReactJS user interface:&amp;nbsp; Here, we need to follow below steps:&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;ol&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;In another separate directory, create ReactJs project by using command npx create-react-app your_project_name&lt;/li&gt;&lt;li style="margin: 0px 0px 0.25em; padding: 0px;"&gt;Once installation is done, then create dependency of axios. Your final package.json file would be like&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"client"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"0.1.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"private"&lt;/span&gt;: &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/jest-dom"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^5.16.5"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/react"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^13.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/user-event"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^13.5.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"axios"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"concurrently"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^8.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^18.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react-dom"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^18.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react-scripts"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"5.0.1"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"web-vitals"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^2.1.4"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"start"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts start"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"build"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts build"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts test"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"eject"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts eject"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"eslintConfig"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"extends"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"react-app"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"react-app/jest"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"browserslist"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"production"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"&amp;gt;0.2%"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"not dead"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"not op_mini all"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"development"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 chrome version"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 firefox version"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 safari version"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;3) Then open App.js file inside folder named as src and add below code&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;React&lt;/span&gt;, { &lt;span style="color: #9cdcfe;"&gt;useState&lt;/span&gt; } &lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'react'&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;axios&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'axios'&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;App&lt;/span&gt; = () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; [&lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;setQuery&lt;/span&gt;] = &lt;span style="color: #dcdcaa;"&gt;useState&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; [&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;setReply&lt;/span&gt;] = &lt;span style="color: #dcdcaa;"&gt;useState&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;handleSubmit&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;event&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;event&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;preventDefault&lt;/span&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;axios&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'http://localhost:3001/api/query'&lt;/span&gt;, { &lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt; });&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;setReply&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;reply&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; };&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;h1&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;My Chatbot&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;h1&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;form&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;onSubmit&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #dcdcaa;"&gt;handleSubmit&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;input&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;"text"&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;value&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;onChange&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;setQuery&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;target&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;value&lt;/span&gt;)&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt; &lt;span style="color: grey;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;button&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;"submit"&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;Send&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;button&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;form&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;p&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;p&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;export&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;default&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;App&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;4) Start your UI react application by using command npm start&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;So, finally when you start UI and Node Js server then you will get functionality as shown below:&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgHKsdgJwqAnXY7jy71wJ-MFPcCXP0in7XBQVV1-HFCdf-TY6FqVxp_xm-30BsCDw6egnsggGWL7eOcYVGWk4ZP6-xV9NvbIaXxGH2ufeFnDFTtRhUCW1JT9C6Ti60VZrl2K_qMErp9aY1NoZ3j6d2w1ujmBQ-0VBMVqOKIuZAEUWiQLJOxp_4WrgBX" style="color: #2288bb; margin-left: 1em; margin-right: 1em; text-decoration-line: none;"&gt;&lt;img alt="" data-original-height="239" data-original-width="385" height="251" src="https://blogger.googleusercontent.com/img/a/AVvXsEgHKsdgJwqAnXY7jy71wJ-MFPcCXP0in7XBQVV1-HFCdf-TY6FqVxp_xm-30BsCDw6egnsggGWL7eOcYVGWk4ZP6-xV9NvbIaXxGH2ufeFnDFTtRhUCW1JT9C6Ti60VZrl2K_qMErp9aY1NoZ3j6d2w1ujmBQ-0VBMVqOKIuZAEUWiQLJOxp_4WrgBX=w404-h251" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 1px solid rgb(238, 238, 238); box-shadow: rgba(0, 0, 0, 0.1) 1px 1px 5px; padding: 5px; position: relative;" width="404" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgs8yeXCDpiOwSyEIgoH02KlYOoX5XZaZQWFoE_uxUKIS3qdYW7_ii7bmlEZxlLDaRO_rfj1Ds7PGqCXKYXlRiZMYDrn27NY3QmI6Ofc6B9eHFW7cX5SzXJgQiY1sPo1a623hs0zZ_i2g5i8WEPa2vSsthtJgPv86egsASy1EUzF1L2HceOM5fC46J_" style="color: #2288bb; margin-left: 1em; margin-right: 1em; text-decoration-line: none;"&gt;&lt;img alt="" data-original-height="216" data-original-width="1290" height="94" src="https://blogger.googleusercontent.com/img/a/AVvXsEgs8yeXCDpiOwSyEIgoH02KlYOoX5XZaZQWFoE_uxUKIS3qdYW7_ii7bmlEZxlLDaRO_rfj1Ds7PGqCXKYXlRiZMYDrn27NY3QmI6Ofc6B9eHFW7cX5SzXJgQiY1sPo1a623hs0zZ_i2g5i8WEPa2vSsthtJgPv86egsASy1EUzF1L2HceOM5fC46J_=w480-h94" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 1px solid rgb(238, 238, 238); box-shadow: rgba(0, 0, 0, 0.1) 1px 1px 5px; padding: 5px; position: relative;" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/zbZfoT3eXmM/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Sequelize in Node.js Application | Sequelize in Express Application | Establishing Database Connections in Node.js</title><link>http://jksnu.blogspot.com/2024/02/sequelize-in-nodejs-application.html</link><pubDate>Thu, 29 Feb 2024 00:52:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-2184869768460359995</guid><description>&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; font-size: 16px; white-space-collapse: preserve;"&gt;Today, I am going to discuss establishing a database connection in Node.js. I have already installed MySQL Server 8.0 on my local machine. I will use an ORM (Object Relational Mapping) framework named Sequelize to connect with the database in my Node.js and Express application. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji" style="color: #0d0d0d;"&gt;&lt;span style="background-color: white; white-space-collapse: preserve;"&gt;&lt;u&gt;&lt;b&gt;Note&lt;/b&gt;&lt;/u&gt;: &lt;/span&gt;&lt;/span&gt;&lt;b style="color: #0d0d0d; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; white-space-collapse: preserve;"&gt;I have created a video tutorial about the same topic. Below is the link of the video tutorial.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://youtu.be/ClssJqN6xsQ" target="_blank"&gt;Video tutorial of Sequelize DB connection in Node.js Application&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; font-size: 16px; white-space-collapse: preserve;"&gt;Below are the steps to establish the database connection and interact with it.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step1&amp;gt;&lt;/b&gt; Install Sequelize and mysql2 driver npm packages in your application.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"helloworld"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"1.0.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"description"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"main"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"index.js"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"echo &lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;Error: no test specified&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"author"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"license"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"ISC"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"express"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^4.18.2"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"morgan"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.10.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"mysql2"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^3.9.2"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"sequelize"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^6.37.1"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step2&amp;gt;&lt;/b&gt; Create a file named as index.js in a folder named as model in your application. In this index.js file, add DB config and create an object of Sequelize. Afterwards, you need to pass this sequelize object in all your model files definition. Model files are nothing but the replicas of a particular table. Below is the code for creating connection between Sequelize and MySql DB. Here, my dbName=testdb, username=root and password=admin. As I have installed MySql in my local machine, so, hostname=localhost otherwise it would be IP address or path of your remote server having the DB.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;DataTypes&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'sequelize'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Initialize Sequelize connection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'testdb'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'root'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'admin'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;host&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'localhost'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;dialect&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'mysql'&lt;/span&gt;, &lt;span style="color: #6a9955;"&gt;// Specify the dialect (in this case, MySQL)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;operationsAliases&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;pool&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;max&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;5&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;min&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;acquire&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;30000&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;idle&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;10000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt; = {};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt; = &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt; = {};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;User&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'./user'&lt;/span&gt;)(&lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;Sequelize&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;module&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;exports&lt;/span&gt; = &lt;span style="color: #4fc1ff;"&gt;db&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Close Sequelize connection when the Node.js process exits&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'exit'&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Handle Ctrl+C or SIGINT signal to gracefully close the connection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'SIGINT'&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Handle uncaught exceptions and promise rejections&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'uncaughtException'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;on&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'unhandledRejection'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;reason&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;promise&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4fc1ff;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;close&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Sequelize connection closed'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;((&lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error closing Sequelize connection:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;closeError&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;exit&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;If you go through the above code, I have written few blocks of code to gracefully close the DB connection if the process is failing due to any reasons like process.exit or SIGINT signal or Unhandled exception or Unhandled rejections.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step 3&amp;gt;&lt;/b&gt; Now, We should create a model file. As discussed, model is nothing but the replica of a table in your DB. I have created here a model named as User corresponding to the table Users. Here, model name and table name may be same. If these are not same then we have to specify the table name by attribute tableName: 'users'. While defining this model, I am using the sequelize object being passed from index.js file where we have created the DB connection with Sequelize.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; = (&lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;UserModel&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;sequelize&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;define&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'User'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;INTEGER&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;primaryKey&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;autoIncrement&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;STRING&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;allowNull&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;email&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;DataTypes&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;STRING&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;allowNull&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; }, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;tableName&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'users'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;timestamps&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;false&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;UserModel&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step 4&amp;gt;&lt;/b&gt; Next, we will utilize this model file in our service class to perform CRUD operations on users table. Here, I have created functions to get list of users, add new user and delete an user. &lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; {&lt;span style="color: #9cdcfe;"&gt;models&lt;/span&gt;: {&lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;}} = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../model'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; () {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;findAll&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;userObj&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;create&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;userObj&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;User&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;destroy&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"where"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;span style="color: #ce9178;"&gt;"id"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;}});&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step 5&amp;gt;&lt;/b&gt; Next, we will create a controller class where we will use service functions to interact with DB. The controller functions will be used as middleware in route file.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;userService&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../service/user'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;next&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;userService&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;[&lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;] = &lt;span style="color: #4fc1ff;"&gt;users&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;next&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;userObj&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"name"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;name&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"email"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;email&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;userService&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;userObj&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;[&lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;] = &lt;span style="color: #4fc1ff;"&gt;insertResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;next&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;userService&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;id&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;[&lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;] = &lt;span style="color: #4fc1ff;"&gt;deleteResult&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;Step 6&amp;gt;&lt;/b&gt; Create a route file and call the controller middleware functions in each routes.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;Router&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;userCtrl&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../controller/user'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #dcdcaa;"&gt;routeMiddleware&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../myMiddleware/customMiddleware'&lt;/span&gt;); &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/helloWorld'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Hello, World!'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;delete&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/deleteuser'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;userCtrl&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;deleteUser&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4fc1ff;"&gt;name&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;email&lt;/span&gt; } = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;result&lt;/span&gt;});&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/users'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;userCtrl&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getUsers&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;result&lt;/span&gt;});&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/adduser'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;userCtrl&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;addUsers&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4fc1ff;"&gt;name&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;email&lt;/span&gt; } = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"result"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;result&lt;/span&gt;});&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;module&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;exports&lt;/span&gt; = &lt;span style="color: #4fc1ff;"&gt;router&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;Step 7&amp;gt; One most important step that we need to do here is to trigger sync() function of Sequelize in your app.js file (where you are initializing your server) to get all your defined models synced with DB.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #1e1e1e; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;bodyParser&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'body-parser'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;morgan&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'morgan'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;const db = require('./model');&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #dcdcaa;"&gt;errorHandler&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;applicationMiddleware&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'./myMiddleware/customMiddleware'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;routes&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'./route/routes'&lt;/span&gt;);&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; = &lt;span style="color: #b5cea8;"&gt;3000&lt;/span&gt;;&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="color: red;"&gt;(async () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&amp;nbsp; await db.sequelize.sync();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;})();&lt;/span&gt;&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #6a9955;"&gt;// Built-in Middleware to parse JSON data in the request body&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;bodyParser&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;());&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #6a9955;"&gt;//Using Third-party middleware function for logging&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;morgan&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'dev'&lt;/span&gt;));&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #6a9955;"&gt;// Application level middleware&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;applicationMiddleware&lt;/span&gt;);&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #6a9955;"&gt;// Use the routes in your app&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;routes&lt;/span&gt;);&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #6a9955;"&gt;//Using error handler middleware&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;errorHandler&lt;/span&gt;);&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="color: #d4d4d4;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4;"&gt;});&lt;/div&gt;&lt;span style="color: #d4d4d4;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;b&gt;I have created a video tutorial about the same topic. Below is the link of the video tutorial.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://youtu.be/ClssJqN6xsQ" target="_blank"&gt;Video tutorial of Sequelize DB connection in Node.js Application&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face="Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;" style="background-color: white; color: #0d0d0d; white-space-collapse: preserve;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Create your ChatBot using NodeJs and ReactJs with ChatGPT API in 10 minutes</title><link>http://jksnu.blogspot.com/2023/06/create-your-chatbot-using-nodejs-and.html</link><pubDate>Sun, 11 Jun 2023 08:59:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-2075089075058431268</guid><description>&lt;p&gt;&amp;nbsp;Today, I am going to show here how easily we can develop our chatbot with in few minutes using ChatGPT api. Here, I am using followings:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;span style="font-size: 13.2px;"&gt; I have described all the steps in my Youtube video also. You can follow it on Youtube for better understanding. The URL of this video:&amp;nbsp;&lt;b&gt;https://youtu.be/zbZfoT3eXmM&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="270" src="https://youtube.com/embed/zbZfoT3eXmM?si=gn1QzdqWtDjPoNRK" style="background-image: url(https://i.ytimg.com/vi/zbZfoT3eXmM/hqdefault.jpg);" width="480"&gt;&lt;/iframe&gt;
&lt;ol style="text-align: left;"&gt;&lt;li&gt;ReactJs for creating user front end&lt;/li&gt;&lt;li&gt;NodeJs for server api interacting with ChatGPT API&lt;/li&gt;&lt;li&gt;ChatGPT API&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Here, we have to complete 3 tasks:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Task 1: Create your ChatGPT API secret key to be used in your code. You need to follow below steps:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Open the url&amp;nbsp;https://openai.com/ and login here using your Google Id or create your own login Id and password.&lt;/li&gt;&lt;li&gt;Create your ChatGPT secret key by clicking on the "Create new Secret key" in the url given in below screenshot. Copy and paste this key in your notepad file. You will not be able to retrieve it again.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjxgXilkzIM8ipBfAp5qfoG3930sucnZSRbOrsRdY9o-W6P1iXEmxbEUQ9sOUrVhBW89zNAtDjPzzcBdiHN7XTjNfzHGDV2vKUt0J65iNqgdU9ePTBGnfBQzSKt4u1bniVOsxlfJDPGuk5JdRJMx4UXIw8FlrW6uLw5c7UzT2bsGPJpoj-QkHOWKQdn" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="437" data-original-width="1176" height="175" src="https://blogger.googleusercontent.com/img/a/AVvXsEjxgXilkzIM8ipBfAp5qfoG3930sucnZSRbOrsRdY9o-W6P1iXEmxbEUQ9sOUrVhBW89zNAtDjPzzcBdiHN7XTjNfzHGDV2vKUt0J65iNqgdU9ePTBGnfBQzSKt4u1bniVOsxlfJDPGuk5JdRJMx4UXIw8FlrW6uLw5c7UzT2bsGPJpoj-QkHOWKQdn=w472-h175" width="472" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Task2: Create Node Js api: Here, we should follow the below steps:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Install NodeJs and NPM&lt;/li&gt;&lt;li&gt;Create a node js project by command npm init -y&lt;/li&gt;&lt;li&gt;Install express and axios dependencies.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"chatnode"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"1.0.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"description"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"main"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"index.js"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"echo &lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;Error: no test specified&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"author"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"Jitendra Kumar Singh"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"license"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"ISC"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"axios"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"express"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^4.18.2"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Create a new file server.js file where you will define port, start server and create api for interacting with ChatGPT api&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;axios&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'axios'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; = &lt;span style="color: #b5cea8;"&gt;3001&lt;/span&gt;; &lt;span style="color: #6a9955;"&gt;// Set your desired port number&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;function&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;header&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Access-Control-Allow-origin"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"http://localhost:3000"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;setHeader&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"GET,POST,OPTIONS"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;header&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Access-Control-Allow-Headers"&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;"Origin, X-Requested-With, Content-Type, Accept"&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;next&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;})&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Middleware to parse JSON request bodies&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;());&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// POST endpoint to handle user queries&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/api/query'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt; } = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Make a POST request to the ChatGPT API&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;axios&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'https://api.openai.com/v1/chat/completions'&lt;/span&gt;, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;model&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'gpt-3.5-turbo'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;messages&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; [{ &lt;span style="color: #9cdcfe;"&gt;role&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'system'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'You are a helpful assistant.'&lt;/span&gt; }, { &lt;span style="color: #9cdcfe;"&gt;role&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'user'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt; }],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }, {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;headers&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'Authorization'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Bearer YOUR_CHATGPT_API_SECRET_KEY'&lt;/span&gt;, &lt;span style="color: #6a9955;"&gt;// Replace with your ChatGPT API key&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;'Content-Type'&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'application/json'&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({ &lt;span style="color: #9cdcfe;"&gt;reply&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;choices&lt;/span&gt;[&lt;span style="color: #b5cea8;"&gt;0&lt;/span&gt;].&lt;span style="color: #9cdcfe;"&gt;message&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;content&lt;/span&gt; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;500&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({ &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'An error occurred while processing the request.'&lt;/span&gt; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;// Start the server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;${&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;5) Start your node js server by npm start&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Task 3: Create ReactJS user interface:&amp;nbsp; Here, we need to follow below steps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;In another separate directory, create ReactJs project by using command npx create-react-app your_project_name&lt;/li&gt;&lt;li&gt;Once installation is done, then create dependency of axios. Your final package.json file would be like&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"client"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"0.1.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"private"&lt;/span&gt;: &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/jest-dom"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^5.16.5"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/react"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^13.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@testing-library/user-event"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^13.5.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"axios"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.4.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"concurrently"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^8.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^18.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react-dom"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^18.2.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"react-scripts"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"5.0.1"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"web-vitals"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^2.1.4"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"start"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts start"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"build"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts build"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts test"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"eject"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"react-scripts eject"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"eslintConfig"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"extends"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"react-app"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"react-app/jest"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"browserslist"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"production"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"&amp;gt;0.2%"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"not dead"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"not op_mini all"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"development"&lt;/span&gt;: [&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 chrome version"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 firefox version"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"last 1 safari version"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ]&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;3) Then open App.js file inside folder named as src and add below code&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;React&lt;/span&gt;, { &lt;span style="color: #9cdcfe;"&gt;useState&lt;/span&gt; } &lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'react'&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;import&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;axios&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;from&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'axios'&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;App&lt;/span&gt; = () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; [&lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;setQuery&lt;/span&gt;] = &lt;span style="color: #dcdcaa;"&gt;useState&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; [&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt;, &lt;span style="color: #dcdcaa;"&gt;setReply&lt;/span&gt;] = &lt;span style="color: #dcdcaa;"&gt;useState&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;''&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;handleSubmit&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;event&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;event&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;preventDefault&lt;/span&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;axios&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'http://localhost:3001/api/query'&lt;/span&gt;, { &lt;span style="color: #9cdcfe;"&gt;query&lt;/span&gt; });&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dcdcaa;"&gt;setReply&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;reply&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;error&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'Error:'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;response&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; };&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;h1&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;My Chatbot&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;h1&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;form&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;onSubmit&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #dcdcaa;"&gt;handleSubmit&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;input&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;"text"&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;value&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;query&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;onChange&lt;/span&gt;=&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;setQuery&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;e&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;target&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;value&lt;/span&gt;)&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt; &lt;span style="color: grey;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;button&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;type&lt;/span&gt;=&lt;span style="color: #ce9178;"&gt;"submit"&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;Send&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;button&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;form&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: grey;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;p&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;{&lt;/span&gt;&lt;span style="color: #4fc1ff;"&gt;reply&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;p&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: grey;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #569cd6;"&gt;div&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; );&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #c586c0;"&gt;export&lt;/span&gt; &lt;span style="color: #c586c0;"&gt;default&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;App&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Start your UI react application by using command npm start&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, finally when you start UI and Node Js server then you will get functionality as shown below:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgHKsdgJwqAnXY7jy71wJ-MFPcCXP0in7XBQVV1-HFCdf-TY6FqVxp_xm-30BsCDw6egnsggGWL7eOcYVGWk4ZP6-xV9NvbIaXxGH2ufeFnDFTtRhUCW1JT9C6Ti60VZrl2K_qMErp9aY1NoZ3j6d2w1ujmBQ-0VBMVqOKIuZAEUWiQLJOxp_4WrgBX" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="239" data-original-width="385" height="251" src="https://blogger.googleusercontent.com/img/a/AVvXsEgHKsdgJwqAnXY7jy71wJ-MFPcCXP0in7XBQVV1-HFCdf-TY6FqVxp_xm-30BsCDw6egnsggGWL7eOcYVGWk4ZP6-xV9NvbIaXxGH2ufeFnDFTtRhUCW1JT9C6Ti60VZrl2K_qMErp9aY1NoZ3j6d2w1ujmBQ-0VBMVqOKIuZAEUWiQLJOxp_4WrgBX=w404-h251" width="404" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgs8yeXCDpiOwSyEIgoH02KlYOoX5XZaZQWFoE_uxUKIS3qdYW7_ii7bmlEZxlLDaRO_rfj1Ds7PGqCXKYXlRiZMYDrn27NY3QmI6Ofc6B9eHFW7cX5SzXJgQiY1sPo1a623hs0zZ_i2g5i8WEPa2vSsthtJgPv86egsASy1EUzF1L2HceOM5fC46J_" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="216" data-original-width="1290" height="94" src="https://blogger.googleusercontent.com/img/a/AVvXsEgs8yeXCDpiOwSyEIgoH02KlYOoX5XZaZQWFoE_uxUKIS3qdYW7_ii7bmlEZxlLDaRO_rfj1Ds7PGqCXKYXlRiZMYDrn27NY3QmI6Ofc6B9eHFW7cX5SzXJgQiY1sPo1a623hs0zZ_i2g5i8WEPa2vSsthtJgPv86egsASy1EUzF1L2HceOM5fC46J_=w480-h94" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/zbZfoT3eXmM/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Assume AWS role and retrieve temporary credentials to access allowed services of AWS</title><link>http://jksnu.blogspot.com/2022/08/assume-aws-role-and-retrieve-temporary.html</link><pubDate>Sat, 13 Aug 2022 00:06:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-7308225447002090039</guid><description>&lt;p&gt;&amp;nbsp;&lt;b&gt;Scenario&lt;/b&gt;:&amp;nbsp;&lt;/p&gt;&lt;p&gt;Suppose I am an user of an AWS account with account id 1111 and I want to programmatically access a S3 bucket created in another AWS account 2222. So, how can I access it programmatically through cross account. To fulfill this scenario, we have to follow the following steps:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Steps&lt;/b&gt;:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Admin of account 2222 should create a bucket say Bucket2222.&lt;/li&gt;&lt;li&gt;Admin of account 2222 should create an IAM Role with minimum 2 policies. One will be the Trust Policy and second with the list of accesses of the Bucket2222&lt;/li&gt;&lt;li&gt;Admin of account 1111 should give me the IAM access of Assume Role&lt;/li&gt;&lt;li&gt;In Node JS code, I have to first get the temporary credential of the IAM Role created in Account 2222 by using aws-sdk version 3 STSClient class&lt;/li&gt;&lt;li&gt;If needed I can cache the credential in API side to reuse it until it is expired&lt;/li&gt;&lt;li&gt;I will access the Bucket2222 in Account 2222 by using S3Client class of aws-sdk version 3 by passing the temporary credentials&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Below is the complete code to access the temporary credential of this role and then listing the bucket items:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Package.json&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"aws_node_poc"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"1.0.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"description"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"main"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"index.js"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"echo &lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;Error: no test specified&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"author"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"Jitendra Kumar Singh"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"license"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"ISC"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@aws-sdk/client-s3"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^3.142.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"@aws-sdk/client-sts"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^3.142.0"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Constants.js&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4ec9b0;"&gt;module&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;exports&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"REGION"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"My Region name"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"ASSUME_ROLE_ARN"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"arn:aws:iam::2222:role/my_assume_role_name"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"TEST_BUCKET_NAME"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"Bucket2222"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;AssumeRoleAndAccessBucket.js&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4ec9b0;"&gt;S3Client&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;ListObjectsCommand&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"@aws-sdk/client-s3"&lt;/span&gt;); &lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #4ec9b0;"&gt;STSClient&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;AssumeRoleCommand&lt;/span&gt;, &lt;span style="color: #4ec9b0;"&gt;GetCallerIdentityCommand&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"@aws-sdk/client-sts"&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; { &lt;span style="color: #9cdcfe;"&gt;REGION&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;ASSUME_ROLE_ARN&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;TEST_BUCKET_NAME&lt;/span&gt; } = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'../../util/constants.js'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #6a9955;"&gt;//Getting Role credentials&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;assumeRole&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;let&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;rolecreds&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* The credential can be cached on api side in reddish or memcache&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* to reuse the credential till it is expired. This credential is having Expiration &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* attribute that defines the time when it is expired&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* We can check this time to verify whether temp credential is expired&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* If not then reuse it and if expired then send a hit to AWS to get new temp credential&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;//rolecreds = "Get credential from API cache if cached and if not expired"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;if&lt;/span&gt;(!&lt;span style="color: #9cdcfe;"&gt;rolecreds&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Create an Amazon STS service client object.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;stsClient&lt;/span&gt; &amp;nbsp;= &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;STSClient&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;region&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;REGION&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;// Set the parameters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;RoleArn&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;ASSUME_ROLE_ARN&lt;/span&gt;, &lt;span style="color: #6a9955;"&gt;//ARN_OF_ROLE_TO_ASSUME&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;RoleSessionName&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"MyAssueRoleSessionName"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;DurationSeconds&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;3600&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;//Assume Role&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;stsClient&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;AssumeRoleCommand&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt;));&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Cred = "&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;rolecreds&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;accessKeyId&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;Credentials&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;AccessKeyId&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;secretAccessKey&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;Credentials&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;SecretAccessKey&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;sessionToken&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;Credentials&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;SessionToken&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;/*const stsParams = { credentials: rolecreds };&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const stsClient1 = new STSClient(stsParams);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const results = await stsClient1.send(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new GetCallerIdentityCommand(rolecreds)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );*/&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;rolecreds&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;; &amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #6a9955;"&gt;//Getting Object List from Bucket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;listObjects&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;roleCred&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;//Creating S3 Client&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3Client&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;S3Client&lt;/span&gt;({ &lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;region&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;REGION&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;credentials&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;roleCred&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;//Getting object list from bucket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;bucketParams&lt;/span&gt; = { &lt;span style="color: #9cdcfe;"&gt;Bucket&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;TEST_BUCKET_NAME&lt;/span&gt; };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3Client&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4ec9b0;"&gt;ListObjectsCommand&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;bucketParams&lt;/span&gt;));&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;data&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #6a9955;"&gt;//Getting Role credential and calling function to get object list from bucket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;listBucketObjects&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;() &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;roleCred&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;assumeRole&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #6a9955;"&gt;//get object list of the bucket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;listObjects&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;roleCred&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;return&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #6a9955;"&gt;//Triggering function to initiate process of getting data from bucket by using Role&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #dcdcaa;"&gt;listBucketObjects&lt;/span&gt;()&lt;/div&gt;&lt;div&gt;&amp;nbsp;.&lt;span style="color: #dcdcaa;"&gt;then&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;data&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;}).&lt;span style="color: #dcdcaa;"&gt;catch&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;err&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Error in my code = "&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;err&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;})&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This is all I am having here to deal with such scenarios. Please let me know in comment section if you facing any problem in any other scenarios, I will try to post blog related with those issues.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>NFR : None Functional Requirement in Software Engineering or Application Development : Part 4: Extensibility, Observability, Maintainability</title><link>http://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_90.html</link><pubDate>Sun, 17 Jul 2022 08:45:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-8648079901632522910</guid><description>&lt;p&gt;&amp;nbsp;In this post, we are going to discuss about the remaining 3 NFRs like &lt;b&gt;Extensibility, Observability, Maintainability&lt;/b&gt;. The link of all of my posts related with NFR are as follows:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Links&lt;/b&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/03/inprogress.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 2: Scalability, Performance, Testability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_17.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 3: Application Security&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_90.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 4: Extensibility, Observability, Maintainability&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Extensibility&lt;/b&gt;: Extensibility is a measure of the ability to extend an application and the level of effort required to implement the extension. It's components are like:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Flexibility&lt;/b&gt;:&amp;nbsp;It defines how flexible your application is towards accepting business growing needs and new functionality changes. We can make our application more flexible by applying OOPS concepts, Dependence Injection, Applying Microservice/ Microviews architecture etc.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Configurability:&amp;nbsp;&lt;/b&gt;It measures the extent of configuration used in your application. We should be able to add or hide the functionality from an application by configuration. There should not be any code related with any 3rd party application or vendor. It should be in config files. So that, we can replace the 3rd party application by changing in config files and very minimal change in code. This way it will require less testing and application will be ready very quickly with less effort and minimum impact.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Customizability&lt;/b&gt;: It is very closely related with configurability. If application is highly configurable then it will be highly customizable. The vendor or client specific functionality in your application should be in plug-in-play mode.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Upgradeability&lt;/b&gt;: It defines how easily your application's different components can be upgraded. Generally, we should use the built-in features of the technologies in our application so that we can upgrade our technology and all the built-in features will be upgraded automatically and easily. If we are using any 3rd party vendor's feature its difficult to upgrade as the upgraded feature may not support our application's underlying technology.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Integrity&lt;/b&gt;: The application should be well integrated with other required business system. For example, your application should be integrated with analytic tool, dataware house etc. It should be capable to sharing the correct reports in terms of csv or excel with other business system. It should be easily integrated with any new incoming business component or vertical by applying some configuration changes and minimal code changes.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Observability&lt;/b&gt;: Observability is all about data exposure and easy access to information required to find issues when the communications fail, internal events do not occur as expected or events occur when they shouldn’t. The observability of your application can be enhanced by proper logging and error handling at every decision point or at the point of communication between different APIs and 3rd party API. We can create some Dashboard to display different metrics of our application. For these purpose, we can use tools like Grafana, Dyanatrace etc. We should also enable dashboard to visualize the logs like Kibana. In case of AWS, we can CloudWatch, Flowlogs for these purpose.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Maintainability&lt;/b&gt;: It refers the ease with which we can understand, repair and improve the code of our application. The more maintainable our application is the more easily we can fix bugs, enhance our application's functionalities and fixing the security issues. While performing maintenance activities we can make 4 types of changes to our application:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Corrective&lt;/b&gt;: It is related with fixing the bugs and issues in our application. Application code should be well segregated in different files and folders according to its purpose so that required code fixes can be applied easily at the required place.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Adaptive&lt;/b&gt;: Our application should be developed in such a way that it can easily accept new functionalities. If needed we can easily removed the deprecated or unwanted functionalities. It should be able to accept the updated libraries, DB, operating system etc.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Perfective&lt;/b&gt;: This functionality includes the code changes to improve the application performance.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Preventive&lt;/b&gt;: It is associated the required changes in application for enhancing security. Upgrading security is an ongoing and never end work. So, our application should always be ready to accept such security related changes.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>NFR : None Functional Requirement in Software Engineering or Application Development : Part 3: Application Security</title><link>http://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_17.html</link><pubDate>Sun, 17 Jul 2022 00:27:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-121453156772290667</guid><description>&lt;p&gt;&amp;nbsp;In my previous posts, I have discussed about NFR definition, its requirement and 3 important NFRs like Scalability, Performance and Testability. Below are the links of all of my posts related with NFR:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Links&lt;/b&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/03/inprogress.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 2: Scalability, Performance, Testability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_17.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 3: Application Security&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_90.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 4: Extensibility, Observability, Maintainability&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Today, I am going to discuss about a very important NFR that is &lt;b&gt;Application Security&lt;/b&gt;. Application security is an ongoing and never ending work. Every day, new security threats comes in cyber space and we along with Business team will have to keep eye open on these security threats and if it is going to impact our application, we should take preventive measures as soon as possible. Generally, application security is the responsibility of not only the Development team but it depends on all the participants of the application like:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Business team&lt;/li&gt;&lt;li&gt;Development team&lt;/li&gt;&lt;li&gt;End users&lt;/li&gt;&lt;li&gt;Hosting environment provider&lt;/li&gt;&lt;li&gt;Network provider&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Guidelines and conventions has been provided for each participants over internet and if every participants follows performs their roles very cautiously then only we can achieve the application security goal. Normally, it has been found that most of the application security issues comes either due to security loop holes present in application development side or from the End user side. The security issues from End user side can be minimized by increasing the awareness about secure use of the application among End users. This is completely separate set of efforts that application owner's Customer facing team should put to make their customer aware about secure use of application as much as possible. Here, I am not concentrating about customer awareness(although it is backbone of any application security). Here, I will discuss about the Development teams roles regarding implementation of security features in an application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have developed several application in Node js and applied below security features. But, these are applicable to any public facing web application developed in any technology.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;CORS vulnerability&lt;/b&gt;: It is abbreviated as Cross Origin Resource Sharing. Here, generally, our application exposes some APIs to share some data to some particular 3rd party API. So, we should keep a check that whether our exposed APIs are communicating with valid 3rd party APIs or some malicious services. This can be achieved by defining a White List array of 3rd party APIs or domain that will be allowed to interact with our application and rest all will be denied. There are several ways of implementing it. In Node Js, we can use CORS NPM package to implement it. If we are deploying our application in cloud like AWS, these cloud providers different security features like NACL, SecurityGroup&lt;/li&gt;&lt;li&gt;&lt;b&gt;CSRF vulnerability&lt;/b&gt;: It is abbreviated as Cross Site Request Forgery. Here, some malicious 3rd party API tries to send a malicious request to your application in such a way that your application assumes that the request is coming from a valid authenticated user. In Node JS application, this vulnerability can be restricted by using CSURF NPM package.&amp;nbsp;Using this package we create a csurf token at Node JS side in a GET method at the very first time when request comes and then this token is sent to client in response body. Now, client should get this token from response body and set it in request header every time it is sending any request to Node JS. On Node JS&amp;nbsp;side, we can define a middleware that will take this token from response header and try to match it with the token generated by Node JS. If it is matching then process the request and if it is not matching then return error response.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Request payload size limit&lt;/b&gt;: Defining request payload max size limit on API side is very important. Generally, Node JS API reads the JSON request payload in synchronous mode and if the request payload size is very large then your application might hang or will become very slow. It should be checked before processing any request on nodejs side. If using Express framework, this size can be defined as app.use(express.json({ limit: 10 })). Here request payload size limit is defined as 10 BYTES. The default request payload size limit in EXPRESS is 100KB. I have created a post on it. Its URL is: &lt;a href="http://jksnu.blogspot.com/2022/03/node-express-application-security-set.html" target="_blank"&gt;&lt;b&gt;Node JS application security&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;File upload size limit&lt;/b&gt;:&amp;nbsp;Define max file size limit if your application supports file upload. It can be defined by using Multer package like&amp;nbsp; multer({limits: { fileSize: maxSize }}). Here, maxSize is in BYTES.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Input data sanitization&lt;/b&gt;: Generally, the fraud like SQL injection and Javascript injections are done by input form data. This can be minimized by sanitizing the input data on API side before using it.&amp;nbsp;Several NPM packages are available to sanitize input data like express-validator. In any database interaction, we should use parametrized query or any ORM library to minimize the chances of SQL injection.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Restrict XSS(Cross site scripting) attack&lt;/b&gt;: This is very much similar to the security issue discussed just above under the heading "Input data sanitization". Here, along with above sanitization measures we can use XSS NPM package to read data from request object.&lt;/li&gt;&lt;li&gt;Use HTTPS instead of HTTP&lt;/li&gt;&lt;li&gt;&lt;b&gt;Authorization&lt;/b&gt;:&amp;nbsp;We should follow the least privilege's mechanism with no previlege as Default. This can be implemented either by our own logic by creating tables where we can keep group of users with roles at group level and check the user's group and role before processing any request. Some available NPM package supporting it are @casl/ability, passport etc.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Authentication&lt;/b&gt;:&amp;nbsp;Use some well established 3rd party authentication mechanism instead of developing your own from scratch. The example of 3rd party authentication mechanism are like Social media authentication, Authentication using Azure or AWS authentication services. After successful authentication, we should create a JWT token by putting required data in token by encrypting it using Encryption algorithm provided by JWT. This token should be signed and sent to client. It should be properly validated before processing every request.&lt;/li&gt;&lt;li&gt;If any important data is coming from UI to API side it must be encrypted. The encryption key must be there in config file in UI. Same key must be used in API side to decrypt it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Proper logging&lt;/b&gt;:&amp;nbsp;Proper logging should be maintained for each request keeping its user, IP information, timestamp, operation success or failure information etc.&lt;/li&gt;&lt;li&gt;OWASP top ten: The OWASP is an organization that provides the list of top 10 security vulnerabilities of application every year. The details can be found on&amp;nbsp;https://owasp.org/Top10 These top 10 vulnerabilities must be taken care in our application at any cost. The top 10 security vulnerabilities for the year 2021 are as follows:&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;A01:2021-Broken Access Control&lt;/b&gt;: It occurs if we provide unwanted or extra privilege's to an user. It will be restricted by the ways discussed under the heading Authorization above with least privilege's.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A02:2021-Cryptographic Failures&lt;/b&gt;: It occurs due to missing required encryption or due to encryption by deprecated or old libraries. It can be restricted by the ways discussed in point (10). The only difference is that the point(10) is talking about data in transit but this is talking about data in transit as well as data in rest. Here, we should use latest cryptographic libraries and always avoid deprecated library like md5 and SHA1.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;A03 Injection&lt;/b&gt;: It can be restricted by sanitizing request data and using parametrized queries in DB interaction as discussed in point(5 and 6)&lt;/li&gt;&lt;li&gt;&lt;b&gt;A04:2021 – Insecure Design&lt;/b&gt;: It is mainly related with Project Design. If project is not designed properly, even best coding practices can not rectify it. There are several tricks to minimize this flaws like using Limiting resource consumption by user or service, writing proper and sufficient unit test and integration test cases, using well established NPM packages.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;A05 Security Misconfiguration&lt;/b&gt;: Security is very vast and as a software engineer we have to constantly evaluate and upgrade our security feature in our application. We will have to keep verifying all the Cloud security features like SecurityGroup, NACL(Network Access Control Layer), IAM(Identity access management) policy etc. We should keep our 3rd party libs and NPM libs up to date. We should always try to move to the latest version of the programming language and DB if possible.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A06:2021 – Vulnerable and Outdated Components&lt;/b&gt;: This can be mainly rectified by using the latest version of our programming language, DB, NPM package and any 3rd party APIs.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A07:2021 – Identification and Authentication Failures&lt;/b&gt;: It mainly occurs if we are not able to keep our identity safe or using very week identity credentials like password or forget password question. To rectify it we should force user to make strong password and keep them properly encrypted in transit as well as in rest. Design your application to make it safe from Brute force attacks or automated attacks. If any crucial API is failing for 3 or more times for a particular user then block him for 30 min or slow down the processing for him. This kind of design will help in restricting automated attacks.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A08:2021 – Software and Data Integrity Failures&lt;/b&gt;: It is mainly associated with the integrity failure or vulnerabilities related with the 3rd party APIs or NPM packages or CDN we are using in our application. So, if we are using any 3rd Party API, it should be interacted with HTTPS protocol along with proper validation of authentication and authorization tokens. We should use well established NPM package.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;A09:2021 – Security Logging and Monitoring Failures&lt;/b&gt;: It is associated with missing required logging and monitoring the logs regularly. It can be prevented by using proper logging in every request and setting up some Alarm or event like CloudWatch alarm in case of AWS to get notification via email or SMS about continuous failure of a particular API. In such cases we can validate logs to identify the cause of failure and to get the clue of any security attacks.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A10:2021 – Server-Side Request Forgery (SSRF)&lt;/b&gt;: It mainly occurs by redirecting user to a different URL. It can be restricted by adding code for properly validating the domain name and port of the URL to ensure whether the domain, host and port are coming in our white list URL before redirecting user to that URL.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Here, I have discussed the minimum required measures that we must take in our application development from security perspective. But, it is not a vast list of security features. There are several more tips and tricks that we can apply in our application. Application security implementation is an ongoing process and development team as well as Business team will have to keep working on it. Its not an one time activity.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my next post, I will discuss about few other NFR topics.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>NFR : None Functional Requirement in Software Engineering or Application Development : Part 2: Scalability, Performance, Testability</title><link>http://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in.html</link><pubDate>Sat, 16 Jul 2022 21:35:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-8357532058225074568</guid><description>&lt;p&gt;&amp;nbsp;In my previous post, I had discussed about below points like:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;What is NFR&lt;/li&gt;&lt;li&gt;What information should be gathered by Development team from Business team with respect to NFR&lt;/li&gt;&lt;li&gt;Listed down few important NFRs&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Link of my NFR related posts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/03/inprogress.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 2: Scalability, Performance, Testability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_17.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 3: Application Security&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_90.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 4: Extensibility, Observability, Maintainability&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the continuation of my previous post about NFR, I am going to discuss about 3 NFR like &lt;b&gt;Scalability, Performance, Testability&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Scalability&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;Scalability is the measure of a system's ability to increase or decrease in performance and cost in response to changes in application and system processing demands. There are 3 important types scalability:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Horizontal Scaling: New server is added instead of upgrading the existing server.&lt;/li&gt;&lt;li&gt;Vertical Scaling: Existing server is upgraded based by increasing CPU, RAM, Processor&lt;/li&gt;&lt;li&gt;Diagonal Scaling: Here, both horizontal and vertical scaling are done.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Below are few of the ways of implementing scalability in your application:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Setup an alarm like CloudWatch Alarm in AWS that triggers an alarm or event when CPU utilization reaches a thresh hold value&lt;/li&gt;&lt;li&gt;Setup an autoscaling by using cloud autoscale functionality or Kubernates&lt;/li&gt;&lt;li&gt;Load Balancing: Define load balancer to equally distribute load on several servers&lt;/li&gt;&lt;li&gt;Enable clustering if your application technology supports. E.g. if your application is using NodeJs for API creation, we can easily enable clustering as discussed in my below posts like:&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;a href="http://jksnu.blogspot.com/2022/02/cluster-in-node-js-application.html" target="_blank"&gt;Cluster in Node Js application&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;a href="http://jksnu.blogspot.com/2022/02/cluster-management-in-node-js.html" target="_blank"&gt;Cluster management in Node Js application by PM2 Lib&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Performance&lt;/b&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;It represents the application's throughput time. Lower the throughput time, higher is the performance. Below are few of the ways to enhance your application's performance:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Setup proper load balancer&lt;/li&gt;&lt;li&gt;Use auto-scaling to enhance performance based on CloudWatch alarm&lt;/li&gt;&lt;li&gt;Setup caching like Reddish or memcache&lt;/li&gt;&lt;li&gt;Flush the cache data at certain intervals based on frequency of write operation in the application and how early to present the latest data to customers&lt;/li&gt;&lt;li&gt;Always use Asynchronous operations where synchronous behavior is not required&lt;/li&gt;&lt;li&gt;Follow all coding conventions and guidelines&lt;/li&gt;&lt;li&gt;Follow all best practices of DB like SQL query optimization, using Views, Indexes, Stored Procedures and SQL functions where ever required.&lt;/li&gt;&lt;li&gt;Use some code validation tools like Sonar or Eslint&lt;/li&gt;&lt;li&gt;Try to use latest stable and suitable version of libs like NPM packages&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Testability&lt;/b&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;In software, testability refers to the degree that any module, requirements, subsystem or other component of your architecture can be verified as satisfactory or not. High testability means it is easy to find and isolate faults as part of your team's regular testing process. Our application must have following criteria to be more testable:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Controllability: The degree to which it is possible to control the state of the component under test (CUT) as required for testing.&lt;/li&gt;&lt;li&gt;Observability: The degree to which it is possible to observe (intermediate and final) test results.&lt;/li&gt;&lt;li&gt;Isolateability: The degree to which the component under test (CUT) can be tested in isolation.&lt;/li&gt;&lt;li&gt;Separation of concerns: The degree to which the component under test has a single, well defined responsibility&lt;/li&gt;&lt;li&gt;Understandability: The degree to which the component under test is documented or self-explaining.&lt;/li&gt;&lt;li&gt;Automatability: The degree to which it is possible to automate testing of the component under test.&lt;/li&gt;&lt;li&gt;Heterogeneity: The degree to which the use of diverse technologies requires to use diverse test methods and tools in parallel.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;In my next post, I will discuss about NFR related with Application security.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>NFR : None Functional Requirement in Software Engineering or Application Development : Part 1</title><link>http://jksnu.blogspot.com/2022/03/inprogress.html</link><pubDate>Fri, 4 Mar 2022 05:50:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6118141290845786211</guid><description>&lt;p&gt;Here is the link of all of my posts on topic NFR:&lt;/p&gt;&lt;p&gt;Links:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/03/inprogress.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 2: Scalability, Performance, Testability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_17.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 3: Application Security&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://jksnu.blogspot.com/2022/07/nfr-none-functional-requirement-in_90.html" target="_blank"&gt;NFR : None Functional Requirement in Software Engineering or Application Development : Part 4: Extensibility, Observability, Maintainability&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NFR(None Functional Requirement) is abbreviated as Non Functional Requirement. In any application development or maintenance work, the NFRs are least discussed but most required activities. Generally, the NFRs of an application are not discussed by Business team. Its Developer's team's responsibility to discuss all the NFRs with business teams and try to understand and create a document of the discussion regarding NFRs implementation with Business team. There may be several discussion points regarding NFRs with Business team like:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Expected minimum or maximum load on application&lt;/li&gt;&lt;li&gt;What is the pick time and off pick time of the application usage&lt;/li&gt;&lt;li&gt;Is the application public facing or only client's employee facing&lt;/li&gt;&lt;li&gt;Application downtime required for build deployment or any upgradation&lt;/li&gt;&lt;li&gt;Response throughput in terms of millisecond required for a feature&lt;/li&gt;&lt;li&gt;Negotiation in business requirement to achieve the required throughput.&lt;/li&gt;&lt;li&gt;Whether the application's feature is read extensive or write extensive to decide how frequently data should be flushed in caching if caching is implemented&lt;/li&gt;&lt;li&gt;Whether customer requires latest data as soon as it is updated in system to decide whether to implement caching&lt;/li&gt;&lt;li&gt;Cost of any 3rd party API that Business can bear.&lt;/li&gt;&lt;li&gt;Cost of skilled resources that Business should bear till the time the application becomes stable(Should be discussed more by Management team)&lt;/li&gt;&lt;li&gt;Tradeoff analysis and discuss with Business team about conflict between different NFRs.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;There are several types of Non Functional Requirements. Few important NFRs are as follows:&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Scalability&lt;/li&gt;&lt;li&gt;Performance&lt;/li&gt;&lt;li&gt;Testability&lt;/li&gt;&lt;li&gt;Security&lt;/li&gt;&lt;li&gt;Extensibility&lt;/li&gt;&lt;li&gt;Observability&lt;/li&gt;&lt;li&gt;Maintainability&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The actual list of NFRs are very vast. Here, I have included only few that are mostly required to be considered in Application development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;In my next blog, I will discuss about the above mentioned NFRs in short.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Node Express application Security: Set Request Size Limit for JSON data and file uploading</title><link>http://jksnu.blogspot.com/2022/03/node-express-application-security-set.html</link><pubDate>Fri, 4 Mar 2022 05:37:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-2898816231077723097</guid><description>&lt;p&gt;&amp;nbsp;Here, we are going to discuss about securing our Node Express application if any unwanted user tries to impact performance of our application by sending a very huge input JSON data or by uploading a very large file.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Generally, Express allows 100KB JSON data by default. If we try to input more than 100KB JSON data, it will return 413 error code. In case of file uploading by using Multer package, there is not any defult file size limit. So, in can case of file uploading, we should apply some file size limit in Node Js code. Lets discuss about JSON input data and file uploading separately.&lt;/p&gt;&lt;p&gt;&lt;b&gt;JSON input data: &lt;/b&gt;As told above, Express allows by default 100KB JSON data which is pretty good in most of the scenarios. If in some scenarios, we need to send JSON data of size more than 100KB, then we have to increase the default JSON data size limit. We can achieve it by using the below two middlewares.&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limit&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'10mb'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;extended&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;}));&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;urlencoded&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limit&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'10mb'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;extended&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;})); &lt;/div&gt;&lt;/div&gt;&lt;p&gt;Now, this express application will allow us to send JSON data of up to 10mb size.&lt;/p&gt;&lt;p&gt;&lt;b&gt;File upload size limit: &lt;/b&gt;Generally, we use Multer package to upload incoming files. Here, we can restrict the security threat by providing the max file size limit in multer. It can be done in the following way.&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'multer'&lt;/span&gt;);&lt;/div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div style="line-height: 19px;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limits&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; { &lt;span style="color: #9cdcfe;"&gt;fileSize&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;1024&lt;/span&gt; * &lt;span style="color: #b5cea8;"&gt;1024&lt;/span&gt; * &lt;span style="color: #b5cea8;"&gt;150&lt;/span&gt; }}); &lt;span style="color: #6a9955;"&gt;//150Mb&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 19px;"&gt;&lt;span style="color: #6a9955;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Here, we are defining the maximum allowed file size limit as 150mb. This size applies for both single file upload and multiple file upload. So, if we are uploading a single file of size say 200mb or two files together with each file having size about 100mb that is 100+100=200mb then, in both the cases, the file size limit is exceeding the defined file size that is 150mb. So, in these cases, it will give error with 500 status code with error message as "File too large".&lt;/p&gt;&lt;p&gt;I have created below two routes for handling single file upload and multiple file upload.&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/singleFileUpload'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;single&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"file"&lt;/span&gt;), (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/multipleFileUpload'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;array&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"file"&lt;/span&gt;), (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Here, I am giving my code that will help in reproducing the outcome of above discussion.&lt;/p&gt;&lt;p&gt;package.json&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"name"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"node_test"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"version"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"1.0.0"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"description"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"main"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"index.js"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"scripts"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"test"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"echo &lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;Error: no test specified&lt;/span&gt;&lt;span style="color: #d7ba7d;"&gt;\"&lt;/span&gt;&lt;span style="color: #ce9178;"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"start"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"nodemon ./app"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"author"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;""&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"license"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"ISC"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"dependencies"&lt;/span&gt;: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"express"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^4.17.3"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"multer"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^1.4.4"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;"nodemon"&lt;/span&gt;: &lt;span style="color: #ce9178;"&gt;"^2.0.15"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;app.js&lt;/p&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'multer'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limits&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; { &lt;span style="color: #9cdcfe;"&gt;fileSize&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #b5cea8;"&gt;1024&lt;/span&gt; * &lt;span style="color: #b5cea8;"&gt;1024&lt;/span&gt; * &lt;span style="color: #b5cea8;"&gt;150&lt;/span&gt; }}); &lt;span style="color: #6a9955;"&gt;//50Mb&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//middleware&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limit&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'10mb'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;extended&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;}));&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;urlencoded&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;limit&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'10mb'&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;extended&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #569cd6;"&gt;true&lt;/span&gt;})); &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt; = &lt;span style="color: #b5cea8;"&gt;3000&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/bigJson'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"jsonData"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/singleFileUpload'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;single&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"file"&lt;/span&gt;), (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/multipleFileUpload'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;array&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"file"&lt;/span&gt;), (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;jsonData&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;status&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;200&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;"success"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;port&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;"Server has started"&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Publish message to AWS SQS queue by NodeJs</title><link>http://jksnu.blogspot.com/2022/02/publish-message-to-aws-sqs-queue-by.html</link><pubDate>Wed, 9 Feb 2022 02:29:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-8821369714251356187</guid><description>&lt;p&gt;&amp;nbsp;Here, we will discuss about how to publish messages to AWS SQS queue by NodeJs. To implement it, we have to follow below steps:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Create an user in AWS and note down its access key Id and secret access key&lt;/li&gt;&lt;li&gt;Create a SQS queue and note down its url&lt;/li&gt;&lt;li&gt;Save user credential in a shared file in your local&lt;/li&gt;&lt;li&gt;Install aws-sdk library&lt;/li&gt;&lt;li&gt;Create a simple node express application with route for publishing message to SQS&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Now, lets discuss each steps one by one.&lt;/div&gt;&lt;div&gt;1) Create an user in AWS and note down its access key Id and secret access key:&amp;nbsp;&lt;span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;I have discussed in detail about this steps in my previous blog under the heading "File handling in AWS S3 by NodeJs". I am giving the link below. Please go through it.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="font-size: 13.2px;"&gt;&lt;b&gt;&lt;a href="https://jksnu.blogspot.com/2022/02/file-handling-in-aws-s3-by-node-js.html#:~:text=1)-,Create%20an%20user%20in%20IAM%20service%20in%20AWS,-%3A%20We%20should%20go" style="color: #2288bb; text-decoration-line: none;" target="_blank"&gt;Create an user in IAM service in AWS&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="font-size: 13.2px;"&gt;2)&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent;"&gt;Create a SQS queue and note down its url: First open AWS console and go to the SQS service and click on the "Create Queue" button. Now, add the Queue name and keep other things with default value. Further click on "Create Queue" button at the bottom.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;span style="background-color: transparent;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgWkqOlQG4gVdBkhVjg9Vb3lLN_SzxBh2obBCZU6kirqM6iPDzOR4YA_6hkZ8RlpIE_I0VEOCweCC1xoSHRUMEwpdAPSCzB6xKLGqPHUm1zOBZ1wz2sonsdZ0mP2MZ-oGL9gwN1ufMjuKa61TvH6Eq6CdpHNPg9Y42QUgn1rR5LYx4G8oA77SrE2qub=s992" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="518" data-original-width="992" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEgWkqOlQG4gVdBkhVjg9Vb3lLN_SzxBh2obBCZU6kirqM6iPDzOR4YA_6hkZ8RlpIE_I0VEOCweCC1xoSHRUMEwpdAPSCzB6xKLGqPHUm1zOBZ1wz2sonsdZ0mP2MZ-oGL9gwN1ufMjuKa61TvH6Eq6CdpHNPg9Y42QUgn1rR5LYx4G8oA77SrE2qub=w548-h286" width="548" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhdQTJrssdVzJ7HnqxTO1170RGMYkQyJ-w-RfQ9cOz28yZuY6erlcj1BV_MoQH3RI7hjPxz_MsTLJaz4Sun1I5j89aYtaYkDgFen1xES5NmRCqxFy4R0icVB1pl9ORIqjqY4eC_yki26k5sUPQYHfkAT4oOLE4FS-MJnG5rrbuIlwdjzZWM0ccAY5Lj=s1226" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="277" data-original-width="1226" height="136" src="https://blogger.googleusercontent.com/img/a/AVvXsEhdQTJrssdVzJ7HnqxTO1170RGMYkQyJ-w-RfQ9cOz28yZuY6erlcj1BV_MoQH3RI7hjPxz_MsTLJaz4Sun1I5j89aYtaYkDgFen1xES5NmRCqxFy4R0icVB1pl9ORIqjqY4eC_yki26k5sUPQYHfkAT4oOLE4FS-MJnG5rrbuIlwdjzZWM0ccAY5Lj=w503-h136" width="503" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;3)&amp;nbsp;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;Save user credential in a shared file in your local:&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 13.2px;"&gt;In this steps, we should save the user credential so that node js application can read it while establishing connection with AWS. We can refer below AWS documentation for this step:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html" style="color: #2288bb; text-decoration-line: none;" target="_blank"&gt;Save User Credentials&lt;/a&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;5)&amp;nbsp;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;Install aws-sdk library: Create a simple node js application and&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 13.2px;"&gt;Use the command like npm install aws-sdk&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="font-size: 13.2px;"&gt;6)&amp;nbsp;&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;Create a simple node express application with route for publishing message to SQS: Here, we are creating a very simple node express application along with two routes:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;a) "&lt;/span&gt;&lt;span style="background-color: #1e1e1e; color: #ce9178; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;/addMessage&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;": This is being used to add messages in SQS queue.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;b) "&lt;/span&gt;&lt;span style="background-color: #1e1e1e; color: #ce9178; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;/getMessage&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;": This is being used to get messages from the SQS queue.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;I am providing here the code for your reference:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 13.2px;"&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;dotenv&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'dotenv'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'path'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'aws-sdk'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;config&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;update&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;region&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'us-east-1'&lt;/span&gt;});&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sqs&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;SQS&lt;/span&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;());&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;dotenv&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;config&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;join&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;__dirname&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'./.env'&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;8000&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Listening port 8000`&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Add a message to SQS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/addMessage'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;MessageBody&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;MessageBody&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;QueueUrl&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;SQS_URL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sqs&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;sendMessage&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Receive a message to SQS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/getMessage'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt; = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;QueueUrl&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;SQS_URL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sqs&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;receiveMessage&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="background-color: transparent;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEgWkqOlQG4gVdBkhVjg9Vb3lLN_SzxBh2obBCZU6kirqM6iPDzOR4YA_6hkZ8RlpIE_I0VEOCweCC1xoSHRUMEwpdAPSCzB6xKLGqPHUm1zOBZ1wz2sonsdZ0mP2MZ-oGL9gwN1ufMjuKa61TvH6Eq6CdpHNPg9Y42QUgn1rR5LYx4G8oA77SrE2qub=s72-w548-h286-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>Publish and subscribe to AWS SNS topic through NodeJS</title><link>http://jksnu.blogspot.com/2022/02/publish-and-subscribe-to-aws-sns-topic.html</link><pubDate>Mon, 7 Feb 2022 23:01:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-228810492864892731</guid><description>&lt;p&gt;&amp;nbsp;Today, we are going to discuss how to publish a message to AWS SNS topic and how to subscribe to the SNS topic so that the subscriber gets the messages published to the SNS topic. We should follow the below steps:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&amp;nbsp;Create an user and user group and note down its accessKeyId and secretAccessKey&lt;/li&gt;&lt;li&gt;Assign this user the required permission for SNS handling&lt;/li&gt;&lt;li&gt;Create a topic and note down its ARN&lt;/li&gt;&lt;li&gt;Install aws-sdk libraray&lt;/li&gt;&lt;li&gt;Save user credential in a shared file in your local&lt;/li&gt;&lt;li&gt;Create a simple node express application and create routes for publish and subscribe&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Now, lets discuss about each steps here:&lt;/div&gt;&lt;div&gt;1) Create an user and user group and note down its accessKeyId and secretAccessKey: I have discussed in detail about this steps in my previous blog under the heading "File handling in AWS S3 by NodeJs". I am giving the link below. Please go through it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;&lt;b&gt;&lt;a href="https://jksnu.blogspot.com/2022/02/file-handling-in-aws-s3-by-node-js.html#:~:text=1)-,Create%20an%20user%20in%20IAM%20service%20in%20AWS,-%3A%20We%20should%20go" target="_blank"&gt;Create an user in IAM service in AWS&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;2)&amp;nbsp;&lt;/span&gt;Assign this user the required permission for SNS handling: Here, we can create a custom policy for SNS handling and then assign it to the group to which the user belongs or we can assign a default SNS policy already provided by AWS. Here, I am going to assign default SNS policy.&lt;/div&gt;&lt;div&gt;First, go to the IAM service in AWS console and then click on your User name to whom you want to provide permission.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwFB5xm-NI9EUOlQXqsmjKrFG1O36HrvNs0spPacCprh2khjRYk6APf6Mabeqzeg1k2l7piw0Hv6zRI_I4WUMN4-l4KRWTRvEh6WqgC3uI4HY6h8pDcN_D-951L2FaFj8RHnVJaAAQgXQFoWGNnjAT1bp4HjAsHa9dpP81EgDYC9Wxp3q7WEQW1EaZ/s1075/Capture.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="464" data-original-width="1075" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwFB5xm-NI9EUOlQXqsmjKrFG1O36HrvNs0spPacCprh2khjRYk6APf6Mabeqzeg1k2l7piw0Hv6zRI_I4WUMN4-l4KRWTRvEh6WqgC3uI4HY6h8pDcN_D-951L2FaFj8RHnVJaAAQgXQFoWGNnjAT1bp4HjAsHa9dpP81EgDYC9Wxp3q7WEQW1EaZ/w572-h280/Capture.PNG" width="572" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Now, click on Add permissions button and then click on "Attach existing policies directly". Now, search for SNS and select "AmazonSNSFullAccess".&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Important Note:&lt;/b&gt; This policy selection is only for demo purpose. In real time, we should provide the least required access for any service to an user. Always avoid providing the full access.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFddLSJFG8-Fnw-PCFocs81xNtZraEsKOAKR1GYB1ICvn0dLOshlApveQsZEJ_AvgVJUqspBlmf9N8Xq_0ElOdDF7cQQuPeHNcSIUSZcqIAcdhBioVPYQ4pJ3LRWT_bxdUVnwl5dEVI0yS8u04ne9Lar6DiK1km9UypWp6zrb-y_D93AV9qNYIefBK/s1142/Capture2.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="560" data-original-width="1142" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFddLSJFG8-Fnw-PCFocs81xNtZraEsKOAKR1GYB1ICvn0dLOshlApveQsZEJ_AvgVJUqspBlmf9N8Xq_0ElOdDF7cQQuPeHNcSIUSZcqIAcdhBioVPYQ4pJ3LRWT_bxdUVnwl5dEVI0yS8u04ne9Lar6DiK1km9UypWp6zrb-y_D93AV9qNYIefBK/w532-h287/Capture2.PNG" width="532" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;3) Create a topic and note down its ARN: Now, go to the SNS service in AWS console and click on the Topics tab present in the left side. Further, click on the Create topic button. In the create topic window, select "Standard" radio button and add your Topic name and display name. You can keep rest of the fields as default.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjZzTvXQbwpBMFnslMfvqtd5AbL0rMgXH3Vu0PHvQB12gTsf13DpM-UtiKnNDoEMA6hLb64TPx7tRJDkzhsIBwRGTGj-3banVsPWn60vSdGLpEq6TUZWBdnj5Dp4_Eof_l3_0jL0L6M5y0QoN7lwxN7I3noxiN7Cq7icVOfhTFJBlNqpSbgr1_JUy_/s814/Capture3.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="519" data-original-width="814" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjZzTvXQbwpBMFnslMfvqtd5AbL0rMgXH3Vu0PHvQB12gTsf13DpM-UtiKnNDoEMA6hLb64TPx7tRJDkzhsIBwRGTGj-3banVsPWn60vSdGLpEq6TUZWBdnj5Dp4_Eof_l3_0jL0L6M5y0QoN7lwxN7I3noxiN7Cq7icVOfhTFJBlNqpSbgr1_JUy_/w564-h360/Capture3.PNG" width="564" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Now, your topic will be created. You should note down the ARN of the topic. It is going to be used in NodeJS code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Install aws-sdk libraray: Use the command like npm install aws-sdk&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5) Save user credential in a shared file in your local:&amp;nbsp;&lt;span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #222222; font-size: 13.2px;"&gt;In this steps, we should save the user credential so that node js application can read it while establishing connection with AWS. We can refer below AWS documentation for this step:&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html" style="color: #2288bb; text-decoration-line: none;" target="_blank"&gt;Save User Credentials&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6) Create a simple node express application and create routes for publish and subscribe: Here, we should create a node js and express application and expose two routes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;One is used to subscribe the email id to the SNS topic represented by the ARN of the topic in the code. Once, the route is triggered, it will trigger SNS service to subscribe the given email id to the SNS topic. You will get a confirmation email on this email id from AWS. This email will have a link and you will have to click on the link to complete the subscription.&lt;/div&gt;&lt;div&gt;Second route is used to publish message to the SNS topic and further SNS topic will forward the message to all the subscribed emails. Here, we have to provide the Subject and Body as a part of message.&amp;nbsp;&lt;/div&gt;&lt;div&gt;I am giving here the code for your reference:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #1e1e1e; line-height: 19px;"&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;dotenv&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'dotenv'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'path'&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'aws-sdk'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;config&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;update&lt;/span&gt;({&lt;span style="color: #9cdcfe;"&gt;region&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'us-east-1'&lt;/span&gt;});&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sns&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;SNS&lt;/span&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;use&lt;/span&gt;(&lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;json&lt;/span&gt;());&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #9cdcfe;"&gt;dotenv&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;config&lt;/span&gt;({&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;join&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;__dirname&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'./.env'&lt;/span&gt;)&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;8000&lt;/span&gt;, () &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;`Listening port 8000`&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;});&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #6a9955;"&gt;//Get sns details&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/mysns'&lt;/span&gt;, (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;({&lt;span style="color: #ce9178;"&gt;"status"&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt;&lt;span style="color: #ce9178;"&gt;"Ok"&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;sns&lt;/span&gt;}));&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #6a9955;"&gt;//Subscribe SNS topic&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/subscribe'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt; = {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Protocol&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #ce9178;"&gt;'Email'&lt;/span&gt;,&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;TopicArn&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;TOPIC_ARN&lt;/span&gt;,&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Endpoint&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;email&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sns&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;subscribe&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #d4d4d4; font-family: Consolas, Courier New, monospace;"&gt;&lt;span style="font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #c586c0; font-family: Consolas, Courier New, monospace;"&gt;&lt;span style="font-size: 14px; white-space: pre;"&gt;res.send(result);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #6a9955;"&gt;//Publish to SNS topic&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/publish'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt; = {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Subject&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;subject&lt;/span&gt;,&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;TopicArn&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;TOPIC_ARN&lt;/span&gt;,&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Message&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;body&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;message&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; };&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;sns&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;publish&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;params&lt;/span&gt;).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #c586c0; font-family: Consolas, Courier New, monospace;"&gt;&lt;span style="font-size: 14px; white-space: pre;"&gt;res.send(result);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div style="color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; white-space: pre;"&gt;});&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwFB5xm-NI9EUOlQXqsmjKrFG1O36HrvNs0spPacCprh2khjRYk6APf6Mabeqzeg1k2l7piw0Hv6zRI_I4WUMN4-l4KRWTRvEh6WqgC3uI4HY6h8pDcN_D-951L2FaFj8RHnVJaAAQgXQFoWGNnjAT1bp4HjAsHa9dpP81EgDYC9Wxp3q7WEQW1EaZ/s72-w572-h280-c/Capture.PNG" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item><item><title>File handling in AWS S3 by Node Js</title><link>http://jksnu.blogspot.com/2022/02/file-handling-in-aws-s3-by-node-js.html</link><pubDate>Sun, 6 Feb 2022 22:51:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3597209610268531963.post-6146547694620649365</guid><description>&lt;p&gt;&amp;nbsp;Today, I am going to discuss about file handling operations like upload a file, get list of all the files, delete a file and download files from S3 bucket in AWS. To perform all these operation, we should follow the below steps:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Create an user in IAM service in AWS&lt;/li&gt;&lt;li&gt;Create a bucket in S3 service in AWS&lt;/li&gt;&lt;li&gt;Save user credential in a shared file in your local&lt;/li&gt;&lt;li&gt;Create a NodeJS application&lt;/li&gt;&lt;li&gt;Install aws-sdk package&lt;/li&gt;&lt;li&gt;Create routes for handling files&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Now, lets discuss about each steps here.&lt;/div&gt;&lt;div&gt;1) Create an user in IAM service in AWS: We should go to the IAM service in AWS and click on "Add users button".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgKtTID_OSCPSdvw4twKC6UKfzkQ_qeobUSRSE_i0whYPVIYMpCv3M62U-AaO-V5zpKXyjMKttBb8CPfBLHW7hw-UlrKyflkzMwTtoi-kCQXJENpUkx_8M2pLLKqn3r4LqVCFHscbXYwJFCsX7k5boijGcGUhHwzgi1m_46bTbHPcrAWsdwBdaEMQXo=s1321" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="263" data-original-width="1321" height="111" src="https://blogger.googleusercontent.com/img/a/AVvXsEgKtTID_OSCPSdvw4twKC6UKfzkQ_qeobUSRSE_i0whYPVIYMpCv3M62U-AaO-V5zpKXyjMKttBb8CPfBLHW7hw-UlrKyflkzMwTtoi-kCQXJENpUkx_8M2pLLKqn3r4LqVCFHscbXYwJFCsX7k5boijGcGUhHwzgi1m_46bTbHPcrAWsdwBdaEMQXo=w557-h111" width="557" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Add the user name and select the check box for "Access key - Programmatic access" and then click on "Next: Permissions"&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEixcoSogs8CVTC_duFMUTEti_pXh--P2pmhJ8Z5_PlvG9nsH1HEQkRQFDeLw9wNREDBuBenfeAuzMlRapdyjBjKFWz86PQiPEpd2Y2CVN9aJsDJXs7T9AmTTwV9iObqKQdCdbHssQ9HqWKaVzJ6FiFCJDsKTsJrA22K9FqbCIpUAcDOeh5rvUIEU8OL=s982" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="570" data-original-width="982" height="303" src="https://blogger.googleusercontent.com/img/a/AVvXsEixcoSogs8CVTC_duFMUTEti_pXh--P2pmhJ8Z5_PlvG9nsH1HEQkRQFDeLw9wNREDBuBenfeAuzMlRapdyjBjKFWz86PQiPEpd2Y2CVN9aJsDJXs7T9AmTTwV9iObqKQdCdbHssQ9HqWKaVzJ6FiFCJDsKTsJrA22K9FqbCIpUAcDOeh5rvUIEU8OL=w522-h303" width="522" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Click on the "Create group" button and then add a group name and then click on Create group button.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhj0ekaFXjhtQhowBBaVVhY4uvFjnI9ql1Wv2uAQoicNU6nXZ_fNKE66UakmeiLn6oUB27GCHYB_KmyFlsUWR-J25Lu610mLeYxCBvxbmNvHSkbSAdgZrQBWxfWQChPflQAC7xhAzJP6ro2gm9Bitmq7jUNICp0_j31_iZgYaKsGvw1Ti01G4ZbSEt_=s1126" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="563" data-original-width="1126" height="270" src="https://blogger.googleusercontent.com/img/a/AVvXsEhj0ekaFXjhtQhowBBaVVhY4uvFjnI9ql1Wv2uAQoicNU6nXZ_fNKE66UakmeiLn6oUB27GCHYB_KmyFlsUWR-J25Lu610mLeYxCBvxbmNvHSkbSAdgZrQBWxfWQChPflQAC7xhAzJP6ro2gm9Bitmq7jUNICp0_j31_iZgYaKsGvw1Ti01G4ZbSEt_=w540-h270" width="540" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Now, on group list page, click on your newly created group and then click on Permissions tab. Now, Add Permissions dropdown box and click on attach Policy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgVk3IkJgTqN1cJPFeZ4O0ND4-Y1VwBpLOe8DuNgo3yYxomrF_2DX1I140muSwt2AEBlu8SrPR4eGDLsnP2qRG5ktatTT5mjdQzd1Z0EfYpDh1ogT_Vnr85ZgOBG7kXeypwzTZgPGIdvpAK7_PBDn_dQgD7M3CDgbwXWvHjb1wFvLiBW3efjMg-yeh5=s1255" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="495" data-original-width="1255" height="222" src="https://blogger.googleusercontent.com/img/a/AVvXsEgVk3IkJgTqN1cJPFeZ4O0ND4-Y1VwBpLOe8DuNgo3yYxomrF_2DX1I140muSwt2AEBlu8SrPR4eGDLsnP2qRG5ktatTT5mjdQzd1Z0EfYpDh1ogT_Vnr85ZgOBG7kXeypwzTZgPGIdvpAK7_PBDn_dQgD7M3CDgbwXWvHjb1wFvLiBW3efjMg-yeh5=w523-h222" width="523" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Now, click on Create Policy and select service as S3. Further, select check boxes of Read, List and Write&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEiwD_JmJY9byuOtNpIjpikGAg-LzosltRAimavYmrxzAlsITGWgWne0JOUhn_qsBYCFKwtfgDo5LRnPKIxuMblMaX3T1WqYg2BFGsjNTyNDrsNe49v86TcHlseXA6MrOErmt22csQpOC9s5DYgSgUmdnpZAPJXNlRPxwHOvO2yixDYTJ6Q_LMXPwKhc=s1162" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="518" data-original-width="1162" height="278" src="https://blogger.googleusercontent.com/img/a/AVvXsEiwD_JmJY9byuOtNpIjpikGAg-LzosltRAimavYmrxzAlsITGWgWne0JOUhn_qsBYCFKwtfgDo5LRnPKIxuMblMaX3T1WqYg2BFGsjNTyNDrsNe49v86TcHlseXA6MrOErmt22csQpOC9s5DYgSgUmdnpZAPJXNlRPxwHOvO2yixDYTJ6Q_LMXPwKhc=w553-h278" width="553" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, up to here, your user and required group and policy is created. Now, note down the user access key id and secret access key. These two keys are going to be used in NodeJS programming.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Create a bucket in S3 service in AWS: Now, we should go to the S3 service of AWS and create a bucket with unique name in AWS.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEj4QZOpR_2j0QcoWlmIuFOwqnMhFhg9P_7917kb1wJWAri6bhG8oqf_ovZZpSpn7F88Rm-6nEHhttJ2hMiEdsdw-98b6ELbphD6ey8mBucw6EOhUDlbR1okb_4FL1GcE5w_Nd3L5V1IQgM-g2MN0riabkPfTHkILQjZHvN-d41PZU7zRbD57Ris_f9e=s797" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="550" data-original-width="797" height="368" src="https://blogger.googleusercontent.com/img/a/AVvXsEj4QZOpR_2j0QcoWlmIuFOwqnMhFhg9P_7917kb1wJWAri6bhG8oqf_ovZZpSpn7F88Rm-6nEHhttJ2hMiEdsdw-98b6ELbphD6ey8mBucw6EOhUDlbR1okb_4FL1GcE5w_Nd3L5V1IQgM-g2MN0riabkPfTHkILQjZHvN-d41PZU7zRbD57Ris_f9e=w533-h368" width="533" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgC6cSf5gMZLFab6F4l-yWszKe-ZWp2F-CSZ9t06P-FCG8qsg6eiaA_KoM3gFw1nzIgJH5gaAlDV4vzw4j0ZhxJyPinZFxmq0KaKnyg55-3e-_62nOL6-pYdZXaGiyUS0kSMLKmUI4WKAAmz0y-T_-vaQrhBIOSWJNfAbEwF5N4DLRsx5E_1J480JLH=s773" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="513" data-original-width="773" height="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEgC6cSf5gMZLFab6F4l-yWszKe-ZWp2F-CSZ9t06P-FCG8qsg6eiaA_KoM3gFw1nzIgJH5gaAlDV4vzw4j0ZhxJyPinZFxmq0KaKnyg55-3e-_62nOL6-pYdZXaGiyUS0kSMLKmUI4WKAAmz0y-T_-vaQrhBIOSWJNfAbEwF5N4DLRsx5E_1J480JLH=w514-h340" width="514" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEi9ux9Hvs093avmsS9fUjpGICi0IjnX22aDsLUoRce1Ysf__SFqB8tGfJom81dMRj7I-Eqwn9CX-Qt5SpfKbfHfjswyPrmnUyefDdeKvtnnE9S78timh0mJBR1H7g0dvpMNzu_v1MYXer-YDcMnIp_Fu7xTKj-my6ds4YnPUlN-2SRoFa0FB96-8XJB=s788" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="588" data-original-width="788" height="382" src="https://blogger.googleusercontent.com/img/a/AVvXsEi9ux9Hvs093avmsS9fUjpGICi0IjnX22aDsLUoRce1Ysf__SFqB8tGfJom81dMRj7I-Eqwn9CX-Qt5SpfKbfHfjswyPrmnUyefDdeKvtnnE9S78timh0mJBR1H7g0dvpMNzu_v1MYXer-YDcMnIp_Fu7xTKj-my6ds4YnPUlN-2SRoFa0FB96-8XJB=w511-h382" width="511" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Save user credential in a shared file in your local: In this steps, we should save the user credential so that node js application can read it while establishing connection with AWS. We can refer below AWS documentation for this step:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html" target="_blank"&gt;Save User Credentials&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Create a NodeJS application: Here, create a very simple node js application with Express. Code will be given in the below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5) Install aws-sdk package: In your node js application, install aws-sdk package by using command like npm install aws-sdk&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6) Create routes for handling files: Below is the code for different routes like upload a file in S3, get list of all the files from the S3 bucket, delete a file, download a file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'express'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;dotenv&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'dotenv'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'path'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'multer'&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;require&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'aws-sdk'&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3&lt;/span&gt; = &lt;span style="color: #569cd6;"&gt;new&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;AWS&lt;/span&gt;.&lt;span style="color: #4ec9b0;"&gt;S3&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;express&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt; = &lt;span style="color: #dcdcaa;"&gt;multer&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&lt;span style="color: #9cdcfe;"&gt;dotenv&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;config&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;path&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;path&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;join&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;__dirname&lt;/span&gt;, &lt;span style="color: #ce9178;"&gt;'./.env'&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listen&lt;/span&gt;(&lt;span style="color: #b5cea8;"&gt;8000&lt;/span&gt;);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Creating routes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//uploading file to s3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;post&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/upload'&lt;/span&gt;, &lt;span style="color: #4fc1ff;"&gt;upload&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;single&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'file'&lt;/span&gt;), &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;putObject&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Body&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;file&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;buffer&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Bucket&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;BUCKET_NAME&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Key&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;file&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;originalname&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Listing uploaded files&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/fileList'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;listObjectsV2&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Bucket&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;BUCKET_NAME&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Deleting a file&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;delete&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/deleteFile/:fileName'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;fileName&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;params&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;fileName&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;deleteObject&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Bucket&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;BUCKET_NAME&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Key&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;fileName&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;})&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #6a9955;"&gt;//Download a file&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #4fc1ff;"&gt;app&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;get&lt;/span&gt;(&lt;span style="color: #ce9178;"&gt;'/downloadFile/:fileName'&lt;/span&gt;, &lt;span style="color: #569cd6;"&gt;async&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;, &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;) &lt;span style="color: #569cd6;"&gt;=&amp;gt;&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c586c0;"&gt;try&lt;/span&gt; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;fileName&lt;/span&gt; = &lt;span style="color: #9cdcfe;"&gt;req&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;params&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;fileName&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #569cd6;"&gt;const&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt; = &lt;span style="color: #c586c0;"&gt;await&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;s3&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;getObject&lt;/span&gt;({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Bucket&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;process&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;env&lt;/span&gt;.&lt;span style="color: #4fc1ff;"&gt;BUCKET_NAME&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;Key&lt;/span&gt;&lt;span style="color: #9cdcfe;"&gt;:&lt;/span&gt; &lt;span style="color: #4fc1ff;"&gt;fileName&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }).&lt;span style="color: #dcdcaa;"&gt;promise&lt;/span&gt;();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;res&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;send&lt;/span&gt;(&lt;span style="color: #4fc1ff;"&gt;result&lt;/span&gt;.&lt;span style="color: #9cdcfe;"&gt;Body&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; } &lt;span style="color: #c586c0;"&gt;catch&lt;/span&gt; (&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #9cdcfe;"&gt;console&lt;/span&gt;.&lt;span style="color: #dcdcaa;"&gt;log&lt;/span&gt;(&lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c586c0;"&gt;throw&lt;/span&gt; &lt;span style="color: #9cdcfe;"&gt;error&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;})&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEgKtTID_OSCPSdvw4twKC6UKfzkQ_qeobUSRSE_i0whYPVIYMpCv3M62U-AaO-V5zpKXyjMKttBb8CPfBLHW7hw-UlrKyflkzMwTtoi-kCQXJENpUkx_8M2pLLKqn3r4LqVCFHscbXYwJFCsX7k5boijGcGUhHwzgi1m_46bTbHPcrAWsdwBdaEMQXo=s72-w557-h111-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>jksnu1@gmail.com (Jitendra Kumar Singh)</author></item></channel></rss>