<?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>DEV Community: Zakariyah Abdulquadri</title>
    <description>The latest articles on DEV Community by Zakariyah Abdulquadri (@the-idealist).</description>
    <link>https://dev.to/the-idealist</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%2F2931444%2F27122fe1-adee-456e-8843-80ee7db040e2.png</url>
      <title>DEV Community: Zakariyah Abdulquadri</title>
      <link>https://dev.to/the-idealist</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/the-idealist"/>
    <language>en</language>
    <item>
      <title>Check this out</title>
      <dc:creator>Zakariyah Abdulquadri</dc:creator>
      <pubDate>Sun, 06 Apr 2025 12:03:02 +0000</pubDate>
      <link>https://dev.to/the-idealist/-2m70</link>
      <guid>https://dev.to/the-idealist/-2m70</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe" class="crayons-story__hidden-navigation-link"&gt;Build a Contact Form in React with Node.js Backend and Store Messages in MongoDB (With Email Alerts!)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/the-idealist" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2931444%2F27122fe1-adee-456e-8843-80ee7db040e2.png" alt="the-idealist profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/the-idealist" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Zakariyah Abdulquadri
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Zakariyah Abdulquadri
                
              
              &lt;div id="story-author-preview-content-2386033" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/the-idealist" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2931444%2F27122fe1-adee-456e-8843-80ee7db040e2.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Zakariyah Abdulquadri&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 6 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe" id="article-link-2386033"&gt;
          Build a Contact Form in React with Node.js Backend and Store Messages in MongoDB (With Email Alerts!)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/node"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;node&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/express"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;express&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/fullstack"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;fullstack&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>react</category>
      <category>node</category>
      <category>express</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>Build a Contact Form in React with Node.js Backend and Store Messages in MongoDB (With Email Alerts!)</title>
      <dc:creator>Zakariyah Abdulquadri</dc:creator>
      <pubDate>Sun, 06 Apr 2025 11:58:47 +0000</pubDate>
      <link>https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe</link>
      <guid>https://dev.to/the-idealist/build-a-contact-form-in-react-with-nodejs-backend-and-store-messages-in-mongodb-with-email-1bhe</guid>
      <description>&lt;p&gt;📌 Introduction:&lt;br&gt;
Want to build a full contact form that actually works?&lt;br&gt;
In this tutorial, I’ll show you how to build a fully functional Contact Form using React for the frontend, Node.js + Express for the backend, and MongoDB to store the data.&lt;br&gt;
Plus, we’ll send email notifications every time someone submits the form!&lt;/p&gt;

&lt;p&gt;This is perfect if you're:&lt;/p&gt;

&lt;p&gt;Learning how the frontend talks to the backend&lt;/p&gt;

&lt;p&gt;Building your portfolio&lt;/p&gt;

&lt;p&gt;Wanting to offer real-time feedback to users&lt;/p&gt;

&lt;p&gt;Let’s dive in! 🛠️&lt;/p&gt;

&lt;p&gt;🧱 Project Structure&lt;br&gt;
contact-form/&lt;br&gt;
├── client/         # React frontend&lt;br&gt;
└── server/         # Node.js + Express backend&lt;/p&gt;

&lt;p&gt;npx create-react-app client&lt;br&gt;
cd client&lt;br&gt;
npm install axios&lt;/p&gt;

&lt;p&gt;📄 Create a Simple Contact Form&lt;br&gt;
client/src/ContactForm.js&lt;br&gt;
import React, { useState } from 'react';&lt;br&gt;
import axios from 'axios';&lt;/p&gt;

&lt;p&gt;const ContactForm = () =&amp;gt; {&lt;br&gt;
  const [form, setForm] = useState({ name: '', email: '', message: '' });&lt;br&gt;
  const [status, setStatus] = useState('');&lt;/p&gt;

&lt;p&gt;const handleChange = e =&amp;gt; {&lt;br&gt;
    setForm({ ...form, [e.target.name]: e.target.value });&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;const handleSubmit = async e =&amp;gt; {&lt;br&gt;
    e.preventDefault();&lt;br&gt;
    try {&lt;br&gt;
      await axios.post('&lt;a href="http://localhost:5000/api/contact" rel="noopener noreferrer"&gt;http://localhost:5000/api/contact&lt;/a&gt;', form);&lt;br&gt;
      setStatus('Message sent successfully!');&lt;br&gt;
      setForm({ name: '', email: '', message: '' });&lt;br&gt;
    } catch (err) {&lt;br&gt;
      setStatus('Failed to send message. Please try again.');&lt;br&gt;
    }&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
      Send&lt;br&gt;
      &lt;p&gt;{status}&lt;/p&gt;
&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default ContactForm;&lt;/p&gt;

&lt;p&gt;🔹 Step 2: Backend with Node.js &amp;amp; Express&lt;br&gt;
✅ Setup&lt;br&gt;
mkdir server&lt;br&gt;
cd server&lt;br&gt;
npm init -y&lt;br&gt;
npm install express mongoose nodemailer cors dotenv&lt;/p&gt;

&lt;p&gt;📄 Create Backend Files&lt;br&gt;
server/index.js&lt;br&gt;
const express = require('express');&lt;br&gt;
const mongoose = require('mongoose');&lt;br&gt;
const cors = require('cors');&lt;br&gt;
require('dotenv').config();&lt;/p&gt;

&lt;p&gt;const contactRoutes = require('./routes/contact');&lt;/p&gt;

&lt;p&gt;const app = express();&lt;br&gt;
app.use(cors());&lt;br&gt;
app.use(express.json());&lt;/p&gt;

&lt;p&gt;app.use('/api/contact', contactRoutes);&lt;/p&gt;

&lt;p&gt;mongoose.connect(process.env.MONGO_URI)&lt;br&gt;
  .then(() =&amp;gt; app.listen(5000, () =&amp;gt; console.log('Server running on port 5000')))&lt;br&gt;
  .catch(err =&amp;gt; console.log(err));&lt;/p&gt;

&lt;p&gt;📄 Create Contact Route&lt;br&gt;
server/routes/contact.js&lt;br&gt;
const express = require('express');&lt;br&gt;
const router = express.Router();&lt;br&gt;
const Contact = require('../models/Contact');&lt;br&gt;
const nodemailer = require('nodemailer');&lt;/p&gt;

&lt;p&gt;router.post('/', async (req, res) =&amp;gt; {&lt;br&gt;
  const { name, email, message } = req.body;&lt;/p&gt;

&lt;p&gt;try {&lt;br&gt;
    const contact = new Contact({ name, email, message });&lt;br&gt;
    await contact.save();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Email Notification
const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: process.env.EMAIL_USER,
    pass: process.env.EMAIL_PASS
  }
});

const mailOptions = {
  from: email,
  to: process.env.EMAIL_USER,
  subject: 'New Contact Form Message',
  text: `From: ${name}\nEmail: ${email}\nMessage: ${message}`
};

await transporter.sendMail(mailOptions);

res.status(200).json({ msg: 'Message sent' });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} catch (err) {&lt;br&gt;
    res.status(500).json({ msg: 'Error sending message' });&lt;br&gt;
  }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;module.exports = router;&lt;/p&gt;

&lt;p&gt;📄 MongoDB Schema&lt;br&gt;
server/models/Contact.js&lt;br&gt;
const mongoose = require('mongoose');&lt;/p&gt;

&lt;p&gt;const contactSchema = new mongoose.Schema({&lt;br&gt;
  name: String,&lt;br&gt;
  email: String,&lt;br&gt;
  message: String,&lt;br&gt;
  createdAt: {&lt;br&gt;
    type: Date,&lt;br&gt;
    default: Date.now&lt;br&gt;
  }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;module.exports = mongoose.model('Contact', contactSchema);&lt;/p&gt;

&lt;p&gt;🌐 .env File&lt;br&gt;
server/.env&lt;br&gt;
MONGO_URI=your_mongodb_connection_string&lt;br&gt;
EMAIL_USER=&lt;a href="mailto:your_email@gmail.com"&gt;your_email@gmail.com&lt;/a&gt;&lt;br&gt;
EMAIL_PASS=your_email_password&lt;/p&gt;

&lt;p&gt;💡 Tip: Use environment variables securely. Don't commit .env to GitHub!&lt;/p&gt;

&lt;p&gt;✅ Final Step: Test It!&lt;br&gt;
Run the server:&lt;br&gt;
node index.js&lt;/p&gt;

&lt;p&gt;Run the React app:&lt;br&gt;
npm start&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; and try sending a message!&lt;/p&gt;

&lt;p&gt;🧠 Common Mistakes&lt;br&gt;
Forgot to enable CORS in backend.&lt;/p&gt;

&lt;p&gt;Backend isn’t running or connected to MongoDB.&lt;/p&gt;

&lt;p&gt;Gmail blocks Nodemailer – use app password or switch to another SMTP.&lt;/p&gt;

&lt;p&gt;🏁 Conclusion&lt;br&gt;
Now you have a full-stack contact form that:&lt;/p&gt;

&lt;p&gt;Takes input from users&lt;/p&gt;

&lt;p&gt;Sends data to the backend&lt;/p&gt;

&lt;p&gt;Saves the message in MongoDB&lt;/p&gt;

&lt;p&gt;Sends you an email instantly 🚀&lt;/p&gt;

</description>
      <category>react</category>
      <category>node</category>
      <category>express</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>React Basics and Setup</title>
      <dc:creator>Zakariyah Abdulquadri</dc:creator>
      <pubDate>Tue, 11 Mar 2025 10:03:32 +0000</pubDate>
      <link>https://dev.to/the-idealist/react-basics-and-setup-38cp</link>
      <guid>https://dev.to/the-idealist/react-basics-and-setup-38cp</guid>
      <description>&lt;p&gt;1️⃣ What is React?&lt;br&gt;
React is a JavaScript library for building user interfaces. It allows you to create components (small, reusable pieces of UI) and makes your web apps fast and interactive by using a virtual DOM.&lt;/p&gt;

&lt;p&gt;🔹 Key Benefits of React:&lt;br&gt;
✅ Component-based: Build reusable UI elements.&lt;br&gt;
✅ Virtual DOM: Faster updates to the UI.&lt;br&gt;
✅ Declarative: Code is easier to read and debug.&lt;br&gt;
✅ Unidirectional Data Flow: Makes state management predictable.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
