<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ishwor karki</title>
    <description>The latest articles on Forem by Ishwor karki (@ishworj).</description>
    <link>https://forem.com/ishworj</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2908168%2F3364a0e8-7b3e-4ecb-9055-5b7b7b6bc1f0.jpeg</url>
      <title>Forem: Ishwor karki</title>
      <link>https://forem.com/ishworj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ishworj"/>
    <language>en</language>
    <item>
      <title>💳 Payment Integration with React and Node.js (Super Simple via Stripe with Dummy Data)</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Mon, 19 May 2025 10:23:27 +0000</pubDate>
      <link>https://forem.com/ishworj/payment-integration-with-react-and-nodejs-super-simple-via-stripe-with-dummy-data-2jlf</link>
      <guid>https://forem.com/ishworj/payment-integration-with-react-and-nodejs-super-simple-via-stripe-with-dummy-data-2jlf</guid>
      <description>&lt;p&gt;If you're building a React project and want to add a &lt;strong&gt;payment feature&lt;/strong&gt;, you're in the right place. In this post, I’ll show you the &lt;strong&gt;easiest way to integrate Stripe Checkout&lt;/strong&gt; using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React for the frontend&lt;/li&gt;
&lt;li&gt;Node.js + Express for the backend&lt;/li&gt;
&lt;li&gt;No database — just dummy data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for beginners who want to learn fast or create a tutorial or demo app!&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 What We’re Building
&lt;/h2&gt;

&lt;p&gt;You’ll create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fake cart (no real database)&lt;/li&gt;
&lt;li&gt;A “Pay Now” button&lt;/li&gt;
&lt;li&gt;A Stripe payment flow&lt;/li&gt;
&lt;li&gt;A simple success/failure result screen&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧰 Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React (using basic components)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js with Express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment&lt;/strong&gt;: Stripe (Checkout session)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Backend Setup (Node.js + Express + Stripe)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create the backend project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;backend
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express stripe cors dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Add your &lt;code&gt;.env&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in the backend folder and add your Stripe secret key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STRIPE_SECRET_KEY=sk_test_your_stripe_secret_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create &lt;code&gt;index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Stripe&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stripe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/checkout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;price_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aud&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;product_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;unit_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;payment_method_types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;customer_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;payment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;success_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5173/payment-result?success=true&amp;amp;session_id={CHECKOUT_SESSION_ID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cancel_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5173/payment-result?success=false&amp;amp;session_id={CHECKOUT_SESSION_ID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Checkout session failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Backend is running on port 5000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💻 Frontend Setup (React)
&lt;/h2&gt;

&lt;p&gt;You can use Vite or Create React App. Let’s say you're inside &lt;code&gt;App.jsx&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Dummy Cart UI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dummyCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;T-shirt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dummyCart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleCheckout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5000/api/checkout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dummyCart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;test@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Dummy email for now&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Checkout failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;40px auto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;🛒 Dummy Cart&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;dummyCart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; x &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; = $&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Total: $&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleCheckout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10px 20px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Pay Now
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Run and Test
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start the backend:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Start the frontend (React app):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Go to your app and click the &lt;strong&gt;"Pay Now"&lt;/strong&gt; button — you’ll be taken to Stripe’s secure checkout page!
Here's what to expect:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;✅ Itemized summary of the products (name, price, quantity)&lt;/li&gt;
&lt;li&gt;💳 Input fields for card details (number, expiry, CVC)&lt;/li&gt;
&lt;li&gt;📧 Pre-filled customer email (if provided in session)&lt;/li&gt;
&lt;li&gt;🔒 Secure and PCI-compliant design&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a &lt;strong&gt;hosted page by Stripe&lt;/strong&gt; — meaning you don't need to worry about building the form or storing card info. It’s fast, secure, and mobile-friendly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  💳 Stripe Test Card Details for Development
&lt;/h1&gt;

&lt;p&gt;Stripe provides a range of test card numbers that work in test mode and simulate different payment scenarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Commonly Used Card
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Card Number&lt;/th&gt;
&lt;th&gt;Expiry&lt;/th&gt;
&lt;th&gt;CVC&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Success Payment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4242 4242 4242 4242&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any future date&lt;/td&gt;
&lt;td&gt;Any 3 digits&lt;/td&gt;
&lt;td&gt;✅ Approved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ❌ Other Test Cards
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Card Number&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Declined card&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4000 0000 0000 0002&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Declined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insufficient funds&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4000 0000 0000 9995&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Declined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Card requires authentication&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4000 0027 6000 3184&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3D Secure required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incorrect CVC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4000 0000 0000 0127&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Declined&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Usage Guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expiry Date&lt;/strong&gt;: Use any future date like &lt;code&gt;12/34&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVC&lt;/strong&gt;: Use any 3-digit number like &lt;code&gt;123&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZIP/Postal Code&lt;/strong&gt;: You can enter any value, e.g., &lt;code&gt;12345&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ What Happens After Payment?
&lt;/h2&gt;

&lt;p&gt;Notice this part in our backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;success_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5173/payment-result?success=true&amp;amp;session_id={CHECKOUT_SESSION_ID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;cancel_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5173/payment-result?success=false&amp;amp;session_id={CHECKOUT_SESSION_ID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stripe will automatically replace &lt;code&gt;{CHECKOUT_SESSION_ID}&lt;/code&gt; with the actual session ID. That means you can &lt;strong&gt;verify the payment on the next page&lt;/strong&gt; using that session.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Challenge For You!
&lt;/h2&gt;

&lt;p&gt;Here’s a fun task to practice what you’ve learned:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Use the &lt;code&gt;session_id&lt;/code&gt; in the URL to verify the payment on your &lt;code&gt;/payment-result&lt;/code&gt; page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Hint:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;useSearchParams()&lt;/code&gt; in React to get the session ID.&lt;/li&gt;
&lt;li&gt;Create a new backend route:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Check if &lt;code&gt;session.payment_status === "paid"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can then show either a &lt;strong&gt;"Payment Successful 🎉"&lt;/strong&gt; or &lt;strong&gt;"Payment Failed ❌"&lt;/strong&gt; message based on the result.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 That’s It!
&lt;/h2&gt;

&lt;p&gt;You now have a working Stripe Checkout integration using dummy data. Feel free to expand this into a real cart later. Let me know if you’d like help verifying the session or deploying it online!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>stripe</category>
    </item>
    <item>
      <title>Image Upload Using Cloudinary + Multer in React.js &amp; Node.js</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Fri, 09 May 2025 12:21:02 +0000</pubDate>
      <link>https://forem.com/ishworj/image-upload-using-cloudinary-multer-in-reactjs-nodejs-35dc</link>
      <guid>https://forem.com/ishworj/image-upload-using-cloudinary-multer-in-reactjs-nodejs-35dc</guid>
      <description>&lt;h2&gt;
  
  
  📸 Image Upload Using Cloudinary + Multer in React.js &amp;amp; Node.js
&lt;/h2&gt;

&lt;p&gt;Handling image uploads is something almost every web app needs to deal with — whether you're building an e-commerce platform, a blog, or a portfolio site. In this post, I’ll walk you through a &lt;strong&gt;simple and practical way to upload images&lt;/strong&gt; from a React frontend to &lt;strong&gt;Cloudinary&lt;/strong&gt;, using &lt;strong&gt;Multer&lt;/strong&gt; in a Node.js + Express backend.&lt;/p&gt;

&lt;p&gt;Let’s get started! 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 What We’re Using
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React.js
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express.js
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware&lt;/strong&gt;: Multer
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Storage&lt;/strong&gt;: Cloudinary&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤔 Why Use Cloudinary?
&lt;/h2&gt;

&lt;p&gt;Cloudinary makes image management incredibly easy and efficient. Here’s why I chose it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Automatically optimizes images for web delivery&lt;/li&gt;
&lt;li&gt;✅ Handles storage, transformation, and CDN delivery out of the box&lt;/li&gt;
&lt;li&gt;✅ Free tier is great for small apps or portfolios&lt;/li&gt;
&lt;li&gt;✅ Easy integration with Node.js and other platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t have to worry about where images are stored, how they are served, or resizing them manually. Cloudinary handles all that for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Step 1: Set Up Cloudinary
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;cloudinary.com&lt;/a&gt; and create a free account.&lt;/li&gt;
&lt;li&gt;Open your &lt;strong&gt;Dashboard&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Take note of your &lt;strong&gt;Cloud name&lt;/strong&gt;, &lt;strong&gt;API key&lt;/strong&gt;, and &lt;strong&gt;API secret&lt;/strong&gt; — you’ll need them soon.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧱 Step 2: Backend Setup (Node.js + Express)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔸 1. Install the packages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express multer cloudinary dotenv cors
npm &lt;span class="nb"&gt;install &lt;/span&gt;multer-storage-cloudinary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔸 2. Create &lt;code&gt;.env&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;At the root of your project, create a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;: Make sure to add &lt;code&gt;.env&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; so you don’t commit your secrets.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🔸 3. Create &lt;code&gt;server.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;uploadRouter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./routes/uploadRoute.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/upload&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uploadRouter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔸 4. Cloudinary Config - &lt;code&gt;config/cloudinaryConfig.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;v2&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;cloudinary&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cloudinary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;cloud_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CLOUDINARY_CLOUD_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CLOUDINARY_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;api_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CLOUDINARY_API_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔸 5. Upload Route - &lt;code&gt;routes/uploadRoute.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;multer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;multer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CloudinaryStorage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;multer-storage-cloudinary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cloudinary&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../config/cloudinaryConfig.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CloudinaryStorage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uploads&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;allowed_formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Upload successful&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 Step 3: React Frontend
&lt;/h2&gt;

&lt;p&gt;Here’s the UI component for selecting, previewing, and uploading the image.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔸 ImageUploader Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ImageUploader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setImage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPreview&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUrl&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleFileChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nf"&gt;setImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setPreview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8000/api/upload&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Upload failed:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Upload an Image&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleFileChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"image/*"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleUpload&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Upload&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Preview"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"200"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Uploaded Image URL:&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"noopener noreferrer"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ImageUploader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 What You Get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ A React UI that previews the image before upload&lt;/li&gt;
&lt;li&gt;✅ Images uploaded and stored in Cloudinary&lt;/li&gt;
&lt;li&gt;✅ The image URL returned and displayed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧼 Bonus Tip
&lt;/h2&gt;

&lt;p&gt;Only allow image files with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;accept=&lt;/span&gt;&lt;span class="s"&gt;"image/*"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🙌 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;We just built a &lt;strong&gt;real-world image upload feature&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Multer&lt;/strong&gt; to process file uploads&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Cloudinary&lt;/strong&gt; to store and optimize them&lt;/li&gt;
&lt;li&gt;⚛️ &lt;strong&gt;React&lt;/strong&gt; to build the user interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup is clean, scalable, and ready to be reused in any modern project. Whether you’re working on a blog, CMS, or e-commerce platform — this pattern will save you time and keep your codebase organized.&lt;/p&gt;




&lt;p&gt;Thanks for following along — and happy coding! ✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>10 Smart Ways to Use Google Maps APIs in Your Projects</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Sat, 03 May 2025 11:16:02 +0000</pubDate>
      <link>https://forem.com/ishworj/10-smart-ways-to-use-google-maps-apis-in-your-projects-2jej</link>
      <guid>https://forem.com/ishworj/10-smart-ways-to-use-google-maps-apis-in-your-projects-2jej</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;1. Show Interactive Maps with Custom Markers&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Let users pan, zoom, and explore the map
&lt;/li&gt;
&lt;li&gt;Add custom markers for branches, events, or users
&lt;/li&gt;
&lt;li&gt;Match the map’s color and theme with your UI
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Real estate, store locators, food delivery zones&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Detect and Use User’s Current Location&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Automatically center the map on user’s location
&lt;/li&gt;
&lt;li&gt;Offer location-specific services and results
&lt;/li&gt;
&lt;li&gt;Pre-fill location fields in forms
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Ride-hailing, local events, service availability&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Use Autocomplete for Fast, Accurate Address Input&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Suggest places as users type
&lt;/li&gt;
&lt;li&gt;Prevent typos and invalid addresses
&lt;/li&gt;
&lt;li&gt;Save time on forms and checkouts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Booking forms, user signups, shipping addresses&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Generate Routes and Directions&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Show routes between two or more points
&lt;/li&gt;
&lt;li&gt;Offer estimated time and distance
&lt;/li&gt;
&lt;li&gt;Support driving, walking, biking, and public transport
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Travel planning, courier tracking, logistics apps&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Find Nearby Places with Photos and Reviews&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Suggest nearby restaurants, shops, or landmarks
&lt;/li&gt;
&lt;li&gt;Display ratings, opening hours, and location info
&lt;/li&gt;
&lt;li&gt;Help users explore their surroundings
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Tourism, hospitality, city guides&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Use Distance Matrix to Compare Travel Times&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Show the nearest store or branch
&lt;/li&gt;
&lt;li&gt;Estimate delivery or arrival time
&lt;/li&gt;
&lt;li&gt;Rank locations by proximity
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Multi-location apps, delivery optimization&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7. Add Real-Time Location Tracking&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Track drivers, vehicles, or users live on the map
&lt;/li&gt;
&lt;li&gt;Update markers dynamically
&lt;/li&gt;
&lt;li&gt;Show movement visually in real time
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Delivery apps, transport services, fleet management&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Display Static Maps in Emails or PDFs&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Generate non-clickable map images
&lt;/li&gt;
&lt;li&gt;Use in booking confirmations, receipts, or reports
&lt;/li&gt;
&lt;li&gt;Show users where their event or order is located
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Email notifications, printable summaries, invoices&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;9. Visualize Data with Heatmaps and Layers&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Show activity levels or density visually
&lt;/li&gt;
&lt;li&gt;Use layers for regions, zones, or boundaries
&lt;/li&gt;
&lt;li&gt;Combine with analytics for real insights
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Admin dashboards, analytics tools, traffic insights&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;10. Secure, Optimize, and Scale&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;$200/month free credit&lt;/strong&gt; wisely
&lt;/li&gt;
&lt;li&gt;Restrict API key by domain or IP
&lt;/li&gt;
&lt;li&gt;Cache repeated calls like geocoding
&lt;/li&gt;
&lt;li&gt;Set usage caps and monitor billing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: All projects — whether small or scaled&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;✅ Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Google Maps APIs are flexible, powerful, and backed by reliable infrastructure. Whether you're building a location-heavy app or just adding a simple map feature, these APIs can help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve UX with smarter location features
&lt;/li&gt;
&lt;li&gt;Visualize data in intuitive ways
&lt;/li&gt;
&lt;li&gt;Enhance trust and usability in your app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Build with purpose — make maps work for your users, not just your interface.&lt;/strong&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Your Website Looks Good — But Is It Actually Good?</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Sun, 20 Apr 2025 10:23:01 +0000</pubDate>
      <link>https://forem.com/ishworj/your-website-looks-good-but-is-it-actually-good-3gl3</link>
      <guid>https://forem.com/ishworj/your-website-looks-good-but-is-it-actually-good-3gl3</guid>
      <description>&lt;p&gt;A Beginner’s Guide to Fixing Hidden Web Issues Using Lighthouse (with React in Mind)&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Lighthouse?
&lt;/h2&gt;

&lt;p&gt;Lighthouse is a tool inside Chrome DevTools that audits your site across four major areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Performance&lt;/li&gt;
&lt;li&gt;♿ Accessibility&lt;/li&gt;
&lt;li&gt;🧠 Best Practices&lt;/li&gt;
&lt;li&gt;🔍 SEO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if your React site looks beautiful, Lighthouse can show serious issues hurting performance, usability, and SEO — issues many beginners miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Performance — Speed = Retention + Ranking
&lt;/h2&gt;

&lt;p&gt;A slow site makes users leave and hurts your Google ranking. React apps grow heavy fast—Lighthouse helps you trim the fat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy-load images&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="about.jpg" loading="lazy" alt="About Us" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Loads images only when needed, improving initial page speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compress and convert images to WebP&lt;/strong&gt;&lt;br&gt;
use Squoosh&lt;br&gt;
Why WebP? It's a modern image format that reduces file size by 30–80% without visible quality loss. Smaller images = faster load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Define width and height&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="banner.webp" width="1200" height="600" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Prevents layout shifts (CLS), making your page load smoother and more stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove unused CSS and JS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Reduces page weight. Dead code = wasted bandwidth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code-split components&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Home = React.lazy(() =&amp;gt; import('./Home'));

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Only loads what's needed per page. Speeds up initial render.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant Boosters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Turn on Brotli or gzip compression&lt;br&gt;
Why? Compresses files before sending to browser = faster transfer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add preconnect to external services:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="preconnect" href="https://fonts.googleapis.com" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Accessibility — Design for Everyone
&lt;/h2&gt;

&lt;p&gt;Accessibility isn't just for screen readers—it's about universal usability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use semantic HTML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;main&amp;gt; &amp;lt;section&amp;gt; &amp;lt;nav&amp;gt; &amp;lt;footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Helps screen readers and improves SEO context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Label form fields&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label for="email"&amp;gt;Email&amp;lt;/label&amp;gt;
&amp;lt;input type="email" id="email" /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Allows users with assistive tech to understand form inputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix color contrast&lt;/strong&gt;&lt;br&gt;
Use 👉 WebAIM Contrast Checker&lt;/p&gt;

&lt;p&gt;Why? Poor contrast makes text unreadable for many users, especially with vision challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use ARIA sparingly&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div role="alert" aria-live="assertive"&amp;gt;Error submitting form&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Gives screen readers important context when native HTML doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices — Secure, Clean, Scalable Code
&lt;/h2&gt;

&lt;p&gt;Lighthouse flags security risks and bad habits that could hurt your users or make your app harder to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use HTTPS&lt;/strong&gt;&lt;br&gt;
Why? Ensures secure connection. Browsers block some features on HTTP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set environment variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;NODE_ENV=production&lt;/code&gt;&lt;br&gt;
Why? Ensures optimized builds by tools like React and Webpack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import only what you use&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Bad
import _ from 'lodash';
// Good
import debounce from 'lodash/debounce';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Smaller bundle sizes = faster loads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid inline scripts and styles&lt;/strong&gt;&lt;br&gt;
Why? Causes render-blocking and security risks (e.g., XSS).&lt;/p&gt;
&lt;h2&gt;
  
  
  SEO — Be Found. Be Clicked
&lt;/h2&gt;

&lt;p&gt;Even if your content is gold, if Google can’t read your site, it won’t rank.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use title &amp;amp; meta tags&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;title&amp;gt;My React App&amp;lt;/title&amp;gt;
&amp;lt;meta name="description" content="The best place to learn code" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Helps search engines understand your page and show better previews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a single &lt;h1&gt;&lt;/h1&gt;&lt;/strong&gt;&lt;br&gt;
per page&lt;br&gt;
Why? Search engines use it to understand your page’s main topic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alt text on images&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="hero.webp" alt="Welcome banner" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Aids screen readers and improves image SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use clean, readable URLs&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;/product/shoes &amp;gt; /product?id=123abc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why? Easier to index and more user-friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After following all guidelines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5atp4gak4qjq6g8de24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5atp4gak4qjq6g8de24.png" alt="Lighthouse report" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Performance Really Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;40% of users bounce if your site takes more than 3 seconds to load&lt;/li&gt;
&lt;li&gt;Google ranks faster sites higher&lt;/li&gt;
&lt;li&gt;Slow sites frustrate users and hurt conversions&lt;/li&gt;
&lt;li&gt;On mobile, speed is even more critical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That’s a Wrap!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open DevTools → Lighthouse → Analyze pageload&lt;br&gt;
Then follow this blog to clean up and ship smarter.&lt;br&gt;
You’ll build faster, more inclusive, and SEO-ready apps — without guessing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build Strong and Secure APIs</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Tue, 15 Apr 2025 09:11:59 +0000</pubDate>
      <link>https://forem.com/ishworj/how-to-build-strong-and-secure-apis-4g57</link>
      <guid>https://forem.com/ishworj/how-to-build-strong-and-secure-apis-4g57</guid>
      <description>&lt;p&gt;APIs (Application Programming Interfaces) are the backbone of modern web and mobile apps. A strong API is not just about making it work—it's about making it secure, scalable, maintainable, and efficient. Whether you're building RESTful APIs for a small project or a large-scale application, here’s a step-by-step guide to help you build robust APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Plan Before You Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Understand the purpose:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem does your API solve?&lt;/li&gt;
&lt;li&gt;Who are the users—internal developers, third parties, or mobile apps?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Define clear endpoints:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List your resources and actions.&lt;/li&gt;
&lt;li&gt;Use nouns for endpoints and HTTP methods for actions.
Example: GET /products, POST /products, DELETE /products/:id&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Use RESTful Standards
&lt;/h2&gt;

&lt;p&gt;Stick to the RESTful principles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use proper HTTP methods:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET to read&lt;/li&gt;
&lt;li&gt;POST to create&lt;/li&gt;
&lt;li&gt;PUT or PATCH to update&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DELETE to remove&lt;br&gt;
&lt;strong&gt;Use meaningful status codes:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid verbs in URLs:&lt;br&gt;
Bad: /getUserInfo&lt;br&gt;
Good: /users/:id&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use a Proper Folder Structure
&lt;/h2&gt;

&lt;p&gt;Organize your codebase:&lt;/p&gt;

&lt;p&gt;/routes&lt;br&gt;
/controllers&lt;br&gt;
/models&lt;br&gt;
/middleware&lt;br&gt;
/utils&lt;/p&gt;

&lt;p&gt;This improves readability and maintainability as your project grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Validate and Sanitize Input
&lt;/h2&gt;

&lt;p&gt;Always validate user input using libraries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Joi or express-validator (Node.js)&lt;/li&gt;
&lt;li&gt;This prevents invalid data from entering your system and stops basic attacks like SQL injection.
Example using express-validator:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;check('email').isEmail().withMessage('Invalid email address')&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Secure Your API
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Authentication and Authorization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use JWT (JSON Web Tokens) or OAuth for user authentication.&lt;/li&gt;
&lt;li&gt;Protect sensitive routes using middleware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use libraries like express-rate-limit to prevent abuse.&lt;/li&gt;
&lt;li&gt;Example: Limit to 100 requests per 15 minutes per IP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CORS Configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only allow trusted domains to access your API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use HTTPS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always encrypt data in transit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Handle Errors Gracefully
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a centralized error-handling middleware.&lt;/li&gt;
&lt;li&gt;Return consistent error responses:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "success": false,&lt;br&gt;
  "message": "Invalid credentials"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Logging and Monitoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use logging libraries like winston or morgan to log requests and errors.&lt;/li&gt;
&lt;li&gt;Monitor APIs with tools like Postman, Swagger, or API Gateway logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Test Your API
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Postman or Insomnia for manual testing.&lt;/li&gt;
&lt;li&gt;Automate tests using Jest, Mocha, or Supertest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test cases should include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valid and invalid inputs&lt;/li&gt;
&lt;li&gt;Authenticated and unauthenticated access&lt;/li&gt;
&lt;li&gt;Error cases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Use Pagination and Filtering
&lt;/h2&gt;

&lt;p&gt;If your API returns large datasets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implement pagination using query parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET /products?page=2&amp;amp;limit=10&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Add filters and sorting for flexibility.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Write Clear Documentation
&lt;/h2&gt;

&lt;p&gt;Use tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swagger (OpenAPI)&lt;/li&gt;
&lt;li&gt;Postman Collection Docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good docs include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint descriptions&lt;/li&gt;
&lt;li&gt;Input/output examples&lt;/li&gt;
&lt;li&gt;Authentication steps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building strong APIs isn’t about just connecting the frontend and backend—it’s about making your system reliable, secure, and scalable. As you continue developing, keep refactoring, reviewing, and testing. A strong API makes collaboration easier and enhances the experience for everyone using it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Designing Intuitive and Responsive Interfaces with React.js and Bootstrap: Everything You Need to Know</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Sat, 12 Apr 2025 08:52:36 +0000</pubDate>
      <link>https://forem.com/ishworj/designing-intuitive-and-responsive-interfaces-with-reactjs-and-bootstrap-everything-you-need-to-41ak</link>
      <guid>https://forem.com/ishworj/designing-intuitive-and-responsive-interfaces-with-reactjs-and-bootstrap-everything-you-need-to-41ak</guid>
      <description>&lt;p&gt;In today’s fast-paced digital world, users expect websites and applications to be fast, easy to use, and visually appealing across all devices. A well-designed user interface (UI) doesn’t just look good—it feels good to interact with. That’s where React.js and Bootstrap come in, offering developers the tools to build responsive, intuitive, and scalable frontends.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why intuitive and responsive design matters&lt;/li&gt;
&lt;li&gt;How React.js and Bootstrap help&lt;/li&gt;
&lt;li&gt;Key design principles to follow&lt;/li&gt;
&lt;li&gt;How to measure user satisfaction and success&lt;/li&gt;
&lt;li&gt;Final thoughts and best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Why Intuitive and Responsive Design Matters
&lt;/h2&gt;

&lt;p&gt;An intuitive design ensures that users can easily understand how to navigate and interact with your app without any instruction. Responsive design means that your interface works well on all screen sizes—from mobile phones to desktop monitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it’s important:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhances usability and user satisfaction&lt;/li&gt;
&lt;li&gt;Reduces bounce rates and increases engagement&lt;/li&gt;
&lt;li&gt;Builds trust and brand consistency&lt;/li&gt;
&lt;li&gt;Improves accessibility and overall performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First impressions matter. If a user finds your interface confusing or clunky, they’re likely to leave—often within seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ How React.js and Bootstrap Help
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React.js: A UI Powerhouse&lt;/strong&gt;&lt;br&gt;
React is a JavaScript library developed by Facebook. It simplifies the process of building user interfaces by breaking them into components.&lt;/p&gt;

&lt;p&gt;Key benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reusable components for faster development&lt;/li&gt;
&lt;li&gt;Virtual DOM for fast UI updates&lt;/li&gt;
&lt;li&gt;Hooks for handling state and logic cleanly&lt;/li&gt;
&lt;li&gt;Efficient rendering and data binding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bootstrap: Rapid, Responsive Design&lt;/strong&gt;&lt;br&gt;
Bootstrap is a front-end framework that includes CSS and JS-based design templates.&lt;/p&gt;

&lt;p&gt;Key benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12-column grid system for responsive layout&lt;/li&gt;
&lt;li&gt;Pre-built UI components (buttons, forms, navbars)&lt;/li&gt;
&lt;li&gt;Utility classes for quick styling&lt;/li&gt;
&lt;li&gt;Mobile-first design philosophy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, React and Bootstrap make a perfect stack for modern web design.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Core Principles of Intuitive UI Design
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.Clarity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid clutter. Prioritize the most important information.&lt;/li&gt;
&lt;li&gt;Use clear labels, icons, and actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2.Consistency&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use uniform styles, components, and patterns.&lt;/li&gt;
&lt;li&gt;Predictable interfaces help users learn faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show loading spinners, success messages, and error alerts.&lt;/li&gt;
&lt;li&gt;Let users know their actions were registered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Accessibility&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use semantic HTML and ARIA labels.&lt;/li&gt;
&lt;li&gt;Ensure color contrast, font size, and keyboard navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Minimal Effort&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce the number of clicks needed for any task.&lt;/li&gt;
&lt;li&gt;Use smart defaults and auto-complete where possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Mobile-First Design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start designing for small screens, then scale up.&lt;/li&gt;
&lt;li&gt;Test responsiveness early and often.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📏 How to Measure Success
&lt;/h2&gt;

&lt;p&gt;After implementing an intuitive and responsive UI, it’s important to assess its impact. Here's how:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. User Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collect feedback through surveys and forms.&lt;/li&gt;
&lt;li&gt;Ask users to rate ease of use, look and feel, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Analytics Tools&lt;/strong&gt;&lt;br&gt;
Use tools like Google Analytics, Hotjar, or Mixpanel to track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bounce rates&lt;/li&gt;
&lt;li&gt;Session duration&lt;/li&gt;
&lt;li&gt;Click-through rates&lt;/li&gt;
&lt;li&gt;Conversion goals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. A/B Testing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test different UI layouts or styles to see which performs better.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Usability Testing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watch users interact with the UI to identify pain points.&lt;/li&gt;
&lt;li&gt;Improvement in these metrics over time is a strong indicator that your design choices are working.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Best Practices for React + Bootstrap UI Projects
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep components small and focused: Each should do one thing well.&lt;/li&gt;
&lt;li&gt;Use Bootstrap’s grid system wisely for layout control.&lt;/li&gt;
&lt;li&gt;Avoid inline styles—stick to classes and reusable styles.&lt;/li&gt;
&lt;li&gt;Optimize performance with memoization, lazy loading, and clean state handling.&lt;/li&gt;
&lt;li&gt;Write semantic HTML for better SEO and accessibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Designing intuitive and responsive interfaces isn't just a trend—it’s a necessity. With frameworks like React.js and Bootstrap, developers can build high-performing, beautiful, and user-friendly web applications faster and more efficiently than ever before.&lt;/p&gt;

&lt;p&gt;Whether you're working on a portfolio site, an admin dashboard, or a full-scale SaaS product, keeping the user at the center of your design decisions will always pay off.&lt;/p&gt;

&lt;p&gt;So next time you start a project, ask yourself:&lt;br&gt;
“Is this design helping the user?”&lt;br&gt;
If the answer is yes, you’re on the right track.&lt;/p&gt;

&lt;p&gt;Enjoyed this read? Follow for more web development tips, frontend design principles, and project breakdowns.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SQL(MYSQL) or NoSQL(MongoDB)</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Wed, 26 Mar 2025 11:38:32 +0000</pubDate>
      <link>https://forem.com/ishworj/sqlmysql-or-nosqlmongodb-1j7h</link>
      <guid>https://forem.com/ishworj/sqlmysql-or-nosqlmongodb-1j7h</guid>
      <description>&lt;p&gt;&lt;strong&gt;MongoDB vs SQL: Which One Should You Use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When choosing a database for your project, the two main options are MongoDB (NoSQL) and SQL databases (like MySQL or PostgreSQL). Both have their strengths and are better suited for different situations. Let’s break it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is MongoDB?&lt;/strong&gt;&lt;br&gt;
MongoDB is a NoSQL database that stores data in a flexible, JSON-like format called BSON. This means you don’t need a fixed structure for your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unstructured or changing data:&lt;/strong&gt; Great for projects where the data structure changes frequently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling:&lt;/strong&gt; MongoDB handles large amounts of data and can scale across multiple servers easily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time apps:&lt;/strong&gt; It’s perfect for apps that need to handle lots of data quickly (e.g., social media, IoT).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is SQL?&lt;/strong&gt;&lt;br&gt;
SQL (Structured Query Language) databases like MySQL store data in tables with rows and columns. The data structure is predefined, and you use SQL to query and update it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data:&lt;/strong&gt; Great when your data has clear relationships (e.g., customers, orders).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex queries:&lt;/strong&gt; SQL is ideal for projects that need to run complex searches or reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transactions&lt;/strong&gt;: If you need reliable, secure transactions (e.g., banking apps), SQL is the way to go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use MongoDB?&lt;/strong&gt;&lt;br&gt;
When your data doesn’t fit into a strict table structure.&lt;/p&gt;

&lt;p&gt;When you need to scale your app to handle lots of data.&lt;/p&gt;

&lt;p&gt;When your app needs to update data quickly and frequently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use SQL?&lt;/strong&gt;&lt;br&gt;
When your data is highly structured and relationships are important.&lt;/p&gt;

&lt;p&gt;When you need to ensure data integrity and consistency.&lt;/p&gt;

&lt;p&gt;When you need complex queries or reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Comparison:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kvaxhuzv77oqizqr9gi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kvaxhuzv77oqizqr9gi.png" alt="Image description" width="552" height="153"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;br&gt;
Choose MongoDB if you need flexibility and scalability for big data or real-time apps.&lt;/p&gt;

&lt;p&gt;Choose SQL if your data is structured, needs strong consistency, or requires complex queries.&lt;/p&gt;

&lt;p&gt;Which one do you prefer for your projects? Let me know in the comments!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Redux (A global state management)</title>
      <dc:creator>Ishwor karki</dc:creator>
      <pubDate>Mon, 03 Mar 2025 11:16:59 +0000</pubDate>
      <link>https://forem.com/ishworj/redux-a-global-state-management-2i4g</link>
      <guid>https://forem.com/ishworj/redux-a-global-state-management-2i4g</guid>
      <description>&lt;h1&gt;
  
  
  Understanding Redux: What, Why, and How to Set It Up
&lt;/h1&gt;

&lt;p&gt;State management can be one of the most challenging aspects of building web applications. As your app grows, handling state in a clean, predictable, and efficient way becomes crucial. &lt;strong&gt;Redux&lt;/strong&gt; is a tool that helps you do exactly that!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Redux?
&lt;/h2&gt;

&lt;p&gt;Redux is a predictable state container for JavaScript apps, especially useful when working with libraries like &lt;strong&gt;React&lt;/strong&gt;. It centralizes your application’s state in a single store, allowing components to subscribe to changes and make your app’s data flow much easier to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Redux?
&lt;/h2&gt;

&lt;p&gt;While smaller apps may manage state easily with React’s &lt;code&gt;useState&lt;/code&gt; or context API, Redux shines in larger applications with more complex state management needs.&lt;/p&gt;

&lt;p&gt;Here are some reasons why Redux is so popular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralized State Management&lt;/strong&gt;: The state of your entire app is stored in a single, centralized store, making it easy to track and debug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictability&lt;/strong&gt;: With Redux, every change to the state is done via &lt;strong&gt;actions&lt;/strong&gt; and handled by &lt;strong&gt;reducers&lt;/strong&gt;, making it easier to understand how data changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Redux works great for large applications where state needs to be shared across many components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware Support&lt;/strong&gt;: Redux has great support for middlewares like Redux Thunk or Redux Saga, which helps manage side effects like data fetching.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Core Concepts of Redux:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt;: The central repository for your app's state. You can think of it as a JavaScript object that holds the state for the entire app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt;: Plain JavaScript objects that describe what happened. They contain a type (usually a string) and payload (additional data).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reducers&lt;/strong&gt;: Functions that take the current state and an action, and return a new state. They dictate how the state updates in response to actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dispatch&lt;/strong&gt;: The method used to send actions to the store. This triggers a state update based on the action type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selectors&lt;/strong&gt;: Functions that help extract specific pieces of state from the store.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Redux Makes Sense
&lt;/h2&gt;

&lt;p&gt;Redux is particularly useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application has a lot of state shared across multiple components.&lt;/li&gt;
&lt;li&gt;You need a reliable way to manage and track changes to your state.&lt;/li&gt;
&lt;li&gt;Your app requires complex logic, such as data fetching, conditional state changes, or synchronizing states across different parts of the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Simple Redux Setup on GitHub
&lt;/h2&gt;

&lt;p&gt;To make the learning curve easier, I’ve set up a simple Redux configuration with React. You can find the complete Redux setup on my &lt;a href="https://github.com/ishworj/redux-eg" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;. This should serve as a great starting point if you’re new to Redux or just looking to see how it’s integrated into a React project!&lt;/p&gt;

&lt;p&gt;Feel free to check it out, clone it, and explore the setup. Happy coding! 💻&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
