<?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: shruti jain</title>
    <description>The latest articles on DEV Community by shruti jain (@shruti_jain_98b67e0d65330).</description>
    <link>https://dev.to/shruti_jain_98b67e0d65330</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%2F2000770%2F3eb62ac6-2029-4c08-bc6a-842b9b165569.jpg</url>
      <title>DEV Community: shruti jain</title>
      <link>https://dev.to/shruti_jain_98b67e0d65330</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shruti_jain_98b67e0d65330"/>
    <language>en</language>
    <item>
      <title>Error Handling in Express.js</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Sat, 26 Jul 2025 07:45:20 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/error-handling-in-expressjs-24ec</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/error-handling-in-expressjs-24ec</guid>
      <description>&lt;p&gt;When building backend applications with Express.js, handling errors properly is crucial. It not only helps you debug issues quickly but also ensures a better experience for users when something goes wrong.&lt;/p&gt;

&lt;p&gt;In this blog, we'll walk through how error handling works in Express, why it matters, and how you can implement it in your own projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Error Handling?
&lt;/h2&gt;

&lt;p&gt;Error handling is the process of catching and responding to errors in your application. These errors could be anything from a missing file, a bad request, a database failure, or even a typo in your code. Instead of letting the app crash or return confusing messages, we use error handlers to catch these issues and return useful responses.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Express Handles Errors
&lt;/h2&gt;

&lt;p&gt;Express has a special kind of middleware just for errors. This middleware function must have &lt;strong&gt;four arguments&lt;/strong&gt;: &lt;code&gt;err&lt;/code&gt;, &lt;code&gt;req&lt;/code&gt;, &lt;code&gt;res&lt;/code&gt;, and &lt;code&gt;next&lt;/code&gt;. Express automatically knows it's an error handler because of the first &lt;code&gt;err&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;Here’s a basic error handler:&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;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;err&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="nx"&gt;next&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;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="nx"&gt;stack&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should add this at the &lt;strong&gt;end of all your route definitions&lt;/strong&gt; so it can catch any errors from above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Throwing and Catching Errors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Throwing Errors in Routes
&lt;/h3&gt;

&lt;p&gt;You can directly throw an error in a route:&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server crashed&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Express will send this error to the error-handling middleware automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using &lt;code&gt;next()&lt;/code&gt; to Pass Errors
&lt;/h3&gt;

&lt;p&gt;Instead of throwing, you can also pass the error using &lt;code&gt;next()&lt;/code&gt;:&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/manual&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="nx"&gt;next&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;err&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;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong manually&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;next&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in your error handler, you can use &lt;code&gt;err.status&lt;/code&gt; to return the correct status code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handling Errors in Async Code
&lt;/h2&gt;

&lt;p&gt;Express doesn't automatically catch errors in async functions. You need to use a &lt;code&gt;try/catch&lt;/code&gt; block or write a helper to manage this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: try/catch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/async&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="nx"&gt;next&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;someAsyncFunction&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;send&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="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;next&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Wrapper Function
&lt;/h3&gt;

&lt;p&gt;You can avoid repeating &lt;code&gt;try/catch&lt;/code&gt; by using a helper:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;asyncHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fn&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;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="nx"&gt;next&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fn&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="nx"&gt;next&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;next&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/safe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;asyncHandler&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;someAsyncFunction&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;send&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="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Handling 404 (Route Not Found)
&lt;/h2&gt;

&lt;p&gt;If a user tries to access a route that doesn’t exist, you can handle it like this:&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;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;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;404&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="s1"&gt;Route not found&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be added just before the final error handler.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Example Structure
&lt;/h2&gt;

&lt;p&gt;Here’s how your basic Express app might look with proper error handling:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;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="c1"&gt;// Routes&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home error&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="c1"&gt;// 404 Handler&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;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;404&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="s1"&gt;Not Found&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="c1"&gt;// Error Handler&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;err&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="nx"&gt;next&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;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&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="nx"&gt;status&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Internal Server Error&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;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;3000&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="s1"&gt;Server is running on port 3000&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;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Good error handling in Express.js makes your application more reliable and easier to maintain. By using middleware properly and planning for both sync and async errors, you can build a backend that handles problems gracefully without confusing your users or crashing your server.&lt;/p&gt;

&lt;p&gt;If you're just starting out with Express, try adding error handlers to your projects today and see how it improves your debugging and stability.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Git Branch Management: Merged, Unmerged, and Clean-Up — A No-Nonsense Cheatsheet</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Mon, 21 Jul 2025 16:01:17 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/git-branch-management-merged-unmerged-and-clean-up-a-no-nonsense-cheatsheet-2e8j</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/git-branch-management-merged-unmerged-and-clean-up-a-no-nonsense-cheatsheet-2e8j</guid>
      <description>&lt;p&gt;Keeping your Git repo clean is underrated. I’ve seen teams drown in a sea of stale branches — some merged, some half-baked, some lost to time.&lt;/p&gt;

&lt;p&gt;So here’s a practical cheatsheet I put together to manage local branches like a pro. If you’re tired of guessing what's merged and what's just wasting disk space, this one’s for you.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 1. List Local Branches Merged into &lt;code&gt;master&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--merged&lt;/span&gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; These are safe to delete. Their commits are already in &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 2. List Local Branches &lt;em&gt;Not&lt;/em&gt; Merged into &lt;code&gt;master&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--no-merged&lt;/span&gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; These might have unmerged work. Review before deleting.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ 3. Check if a Specific Branch Is Fully Merged
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge-base &lt;span class="nt"&gt;--is-ancestor&lt;/span&gt; your-branch master &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Merged ✅"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not merged ❌"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Quick yes/no check without manually scanning logs.&lt;/p&gt;




&lt;h3&gt;
  
  
  🍒 4. See What’s Unique to Your Branch (&lt;code&gt;git cherry&lt;/code&gt; FTW)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry master your-branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; = unique commit in your branch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-&lt;/code&gt; = already in master&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No output = fully merged&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧼 5. Delete Local Branches
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-d&lt;/span&gt; your-branch    &lt;span class="c"&gt;# Safe delete (if merged)&lt;/span&gt;
git branch &lt;span class="nt"&gt;-D&lt;/span&gt; your-branch    &lt;span class="c"&gt;# Force delete (if unmerged)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use with caution. Especially &lt;code&gt;-D&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ☁️ 6. Delete Remote Branch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin &lt;span class="nt"&gt;--delete&lt;/span&gt; your-branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Local cleanup is one thing. Don't leave junk on origin either.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⏱ 7. Sort Local Branches by Last Commit Date
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="nt"&gt;-each-ref&lt;/span&gt; &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-committerdate&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%(committerdate:short)  %(refname:short)"&lt;/span&gt; refs/heads/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Spot stale or abandoned branches quickly.&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 8. One-Liner: Show Merged vs Not Merged Branches
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Merged ==="&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; git branch &lt;span class="nt"&gt;--merged&lt;/span&gt; master&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Not Merged ==="&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; git branch &lt;span class="nt"&gt;--no-merged&lt;/span&gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Good for audits and cleanup days.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧽 9. Auto-Delete All Safe-to-Remove Local Branches
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;--merged&lt;/span&gt; master | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-vE&lt;/span&gt; &lt;span class="s1"&gt;'^\*|master|main|dev'&lt;/span&gt; | xargs &lt;span class="nt"&gt;-n&lt;/span&gt; 1 git branch &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Deletes all merged local branches except the important ones (&lt;code&gt;master&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;dev&lt;/code&gt;, current branch).&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 Bonus Tip: Automate It
&lt;/h3&gt;

&lt;p&gt;Add a script or alias for regular cleanup. Git hygiene = happier devs + cleaner merges.&lt;/p&gt;




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

&lt;p&gt;Don’t let your repo turn into a graveyard of zombie branches. A few CLI tricks like these can keep things lean, understandable, and merge-conflict-free.&lt;/p&gt;

&lt;p&gt;Got a favorite cleanup command or Git trick? Drop it in the comments — let’s trade war tools.&lt;/p&gt;

</description>
      <category>git</category>
      <category>vscode</category>
      <category>developer</category>
    </item>
    <item>
      <title>Supercharge Your Website: A Deep Dive into HTTP Caching</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Wed, 26 Mar 2025 06:45:28 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/supercharge-your-website-a-deep-dive-into-http-caching-13pl</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/supercharge-your-website-a-deep-dive-into-http-caching-13pl</guid>
      <description>&lt;p&gt;In today's fast-paced digital landscape, website speed is more critical than ever. Users expect web pages to load instantly; even a slight delay can result in lost traffic and frustrated visitors. One of the most effective ways to enhance website performance is through &lt;strong&gt;HTTP caching&lt;/strong&gt;. In this guide, we’ll explore what HTTP caching is, why it matters, and how you can implement it to optimize your website.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What is HTTP Caching?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;HTTP caching is the process of &lt;strong&gt;storing copies of web resources&lt;/strong&gt; (such as HTML pages, images, CSS files, and JavaScript files) in temporary storage locations known as caches. When a user requests a resource, the browser or an intermediate cache checks whether it already has a fresh copy, if it does, the cached version is served instead of fetching the resource from the origin server. This significantly reduces load time and improves the overall user experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why is Caching Important?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Caching offers several benefits that can transform website performance:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Latency:&lt;/strong&gt; Loading resources from a cache is much faster than fetching them from a remote server.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth Savings:&lt;/strong&gt; Less data is transferred over the network, benefiting both servers and users, especially those on mobile networks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Reducing server load allows websites to handle more traffic efficiently.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved SEO:&lt;/strong&gt; Search engines prioritize fast-loading websites, giving cached sites a ranking advantage.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better User Experience:&lt;/strong&gt; Faster load times lead to higher user satisfaction and engagement.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Types of Caches&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There are several caching mechanisms at play in HTTP caching:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser Cache:&lt;/strong&gt; Stores web resources locally on a user's device, allowing quick access to repeated content.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy Cache:&lt;/strong&gt; Used in corporate networks or ISPs to store frequently accessed resources, reducing bandwidth consumption.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CDN (Content Delivery Network) Cache:&lt;/strong&gt; CDNs store copies of resources in multiple locations worldwide, serving content from the closest server to the user.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding HTTP Cache Headers&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;HTTP caching relies on specific headers that control how resources are cached. These headers guide browsers, proxies, and CDNs on how to handle cached content.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Cache-Control Directives&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;public:&lt;/strong&gt; Allows caching by any cache (browser, proxy, CDN).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;private:&lt;/strong&gt; Restricts caching to the user’s browser only, preventing storage in shared caches.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;max-age=seconds:&lt;/strong&gt; Defines how long a resource remains fresh before requiring validation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;s-maxage=seconds:&lt;/strong&gt; Similar to &lt;code&gt;max-age&lt;/code&gt;, but applies only to shared caches (CDNs, proxies).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stale-while-revalidate=seconds:&lt;/strong&gt; Allows serving stale content while fetching an updated version.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stale-if-error=seconds:&lt;/strong&gt; Allows serving stale content if the origin server is unreachable.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;no-cache:&lt;/strong&gt; Forces the cache to validate the resource with the origin server before using it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;no-store:&lt;/strong&gt; Prevents caching altogether, used for sensitive data.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Other Important Headers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETag:&lt;/strong&gt; Assigns a unique identifier to a resource version, aiding efficient revalidation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last-Modified:&lt;/strong&gt; Indicates the last time a resource was changed, helping determine if an update is needed.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Practical Examples of Cache-Control in Action&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Static Assets (Images, CSS, JavaScript)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These resources rarely change and should be cached for a long time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache-Control: public, max-age=31536000, s-maxage=31536000, stale-while-revalidate=60, stale-if-error=86400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fresh for &lt;strong&gt;1 year&lt;/strong&gt; in both browsers and CDNs.
&lt;/li&gt;
&lt;li&gt;Can serve stale content for &lt;strong&gt;60 seconds&lt;/strong&gt; while revalidating.
&lt;/li&gt;
&lt;li&gt;If revalidation fails, stale content can be served for &lt;strong&gt;24 hours&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. API Responses (Frequently Changing Data)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;APIs often return data that changes frequently but still benefits from short-term caching.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache-Control: public, max-age=3600, s-maxage=86400, stale-while-revalidate=60, stale-if-error=86400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fresh for &lt;strong&gt;1 hour&lt;/strong&gt; in browsers, &lt;strong&gt;24 hours&lt;/strong&gt; in CDNs.
&lt;/li&gt;
&lt;li&gt;Stale content can be served for &lt;strong&gt;60 seconds&lt;/strong&gt; while revalidating.
&lt;/li&gt;
&lt;li&gt;If an error occurs, stale content can be used for &lt;strong&gt;24 hours&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. User-Specific Data (Personalized Content)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data tied to individual users should not be cached by shared caches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache-Control: private, max-age=600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fresh for &lt;strong&gt;10 minutes&lt;/strong&gt;, but only cached in the user's browser.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Sensitive Data (No Caching Allowed)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For sensitive information, caching must be completely disabled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache-Control: no-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Ensures data is never stored in any cache.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Caching Strategies for Maximum Performance&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To make the most of HTTP caching, consider implementing these strategies:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CDN Caching:&lt;/strong&gt; Use a CDN to cache static assets and frequently accessed API responses.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser Caching:&lt;/strong&gt; Set Cache-Control headers with &lt;code&gt;public&lt;/code&gt; or &lt;code&gt;private&lt;/code&gt; to manage browser cache behavior.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revalidation:&lt;/strong&gt; Use &lt;code&gt;ETag&lt;/code&gt; and &lt;code&gt;Last-Modified&lt;/code&gt; to enable efficient resource validation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale Content Handling:&lt;/strong&gt; Utilize &lt;code&gt;stale-while-revalidate&lt;/code&gt; and &lt;code&gt;stale-if-error&lt;/code&gt; to improve user experience during revalidation or errors.
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;HTTP caching is an essential technique for optimizing website performance, reducing server load, and enhancing the user experience. By leveraging the right cache headers and strategies, you can significantly improve your website’s speed and efficiency.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Call to Action&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Start optimizing your website today with HTTP caching. Experiment with different &lt;code&gt;Cache-Control&lt;/code&gt; directives and monitor the impact on performance.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Takeaways for Developers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Caching is critical for performance optimization.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cache-Control&lt;/code&gt; is the primary tool for managing cache behavior.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;public&lt;/code&gt; vs. &lt;code&gt;private&lt;/code&gt; determines who can cache a resource.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max-age&lt;/code&gt; and &lt;code&gt;s-maxage&lt;/code&gt; control how long resources stay fresh.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stale-while-revalidate&lt;/code&gt; and &lt;code&gt;stale-if-error&lt;/code&gt; improve user experience.
&lt;/li&gt;
&lt;li&gt;CDNs boost performance for global audiences.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ETag&lt;/code&gt; and &lt;code&gt;Last-Modified&lt;/code&gt; enable efficient resource validation.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementing caching correctly can make a huge difference in site speed, scalability, and user satisfaction. Take advantage of HTTP caching today and watch your website perform at its best.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cache</category>
      <category>cdn</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Optimizing MongoDB Queries with `.executionStats`</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Thu, 27 Feb 2025 16:08:37 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/optimizing-mongodb-queries-with-executionstats-4phc</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/optimizing-mongodb-queries-with-executionstats-4phc</guid>
      <description>&lt;p&gt;As developers, we often focus on writing functional queries, but ensuring they run efficiently is just as important. MongoDB provides a powerful tool—&lt;code&gt;.executionStats&lt;/code&gt;—that helps analyze query performance and optimize database operations. Let’s explore how it works and why it’s useful in day-to-day development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is &lt;code&gt;.executionStats&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;In MongoDB, &lt;code&gt;.executionStats&lt;/code&gt; is a mode in the &lt;code&gt;explain()&lt;/code&gt; method that provides in-depth insights into how a query executes. It helps you understand query performance, index usage, and potential optimizations.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use &lt;code&gt;.executionStats&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;To analyze a query’s performance, run:&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;executionStats&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;For example, if you want to check the performance of a query fetching users older than 25:&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;executionStats&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;This will return a detailed JSON output containing various execution metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Metrics in &lt;code&gt;.executionStats&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Here are some critical fields to look at:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;executionSuccess&lt;/strong&gt; – Indicates whether the query executed successfully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nReturned&lt;/strong&gt; – Number of documents returned by the query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;executionTimeMillis&lt;/strong&gt; – Total execution time (in milliseconds).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;totalKeysExamined&lt;/strong&gt; – Number of index keys examined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;totalDocsExamined&lt;/strong&gt; – Number of documents scanned in the collection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;executionStages&lt;/strong&gt; – Details about how MongoDB executed the query.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why is This Useful for Developers?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Identifying Slow Queries
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;executionTimeMillis&lt;/code&gt; is high, the query might be inefficient. Identifying slow queries helps in improving performance, especially for large datasets.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Index Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;totalDocsExamined&lt;/code&gt; is much higher than &lt;code&gt;nReturned&lt;/code&gt;, MongoDB is scanning too many documents.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;totalKeysExamined&lt;/code&gt; is high, an index might not be working effectively.&lt;/li&gt;
&lt;li&gt;This helps in deciding whether to &lt;strong&gt;create, modify, or remove indexes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠 Debugging Execution Plans
&lt;/h3&gt;

&lt;p&gt;If a query isn’t using an index as expected, &lt;code&gt;.executionStats&lt;/code&gt; can help diagnose why. This prevents full collection scans and speeds up response times.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improving Scalability
&lt;/h3&gt;

&lt;p&gt;Optimizing queries ensures they can handle large traffic loads without causing high CPU or memory usage, making your application more scalable.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Comparing Query Performance
&lt;/h3&gt;

&lt;p&gt;By testing different queries and comparing their &lt;code&gt;.executionStats&lt;/code&gt;, developers can determine the most efficient approach for retrieving data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Optimizing a Query
&lt;/h2&gt;

&lt;p&gt;Let’s say you run the following query:&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;executionStats&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;If the output shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nReturned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalDocsExamined"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executionTimeMillis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means MongoDB is scanning 10,000 documents to return just 10! The solution? Add an index:&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After indexing, running &lt;code&gt;.executionStats&lt;/code&gt; again might show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nReturned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalDocsExamined"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executionTimeMillis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This massive improvement makes the database more responsive and efficient.&lt;/p&gt;

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

&lt;p&gt;Using &lt;code&gt;.executionStats&lt;/code&gt; regularly helps developers:&lt;br&gt;
✅ Identify slow queries&lt;br&gt;&lt;br&gt;
✅ Optimize indexes&lt;br&gt;&lt;br&gt;
✅ Debug query execution plans&lt;br&gt;&lt;br&gt;
✅ Improve database scalability&lt;br&gt;&lt;br&gt;
✅ Ensure applications run smoothly even under high loads  &lt;/p&gt;

&lt;p&gt;Next time you write a MongoDB query, don’t just check if it works—check how well it works! 🚀&lt;/p&gt;




&lt;p&gt;Do you have a query that needs optimization? Share it in the comments! 😃&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mongodb</category>
      <category>monitoring</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Removing a Tracked File from Git After Adding It to .gitignore</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Wed, 19 Feb 2025 10:03:05 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/removing-a-tracked-file-from-git-after-adding-it-to-gitignore-323a</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/removing-a-tracked-file-from-git-after-adding-it-to-gitignore-323a</guid>
      <description>&lt;p&gt;Sometimes, we accidentally commit files that should have been ignored, like &lt;code&gt;config/config.js&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, or &lt;code&gt;node_modules/&lt;/code&gt;. Adding them to &lt;code&gt;.gitignore&lt;/code&gt; &lt;strong&gt;after&lt;/strong&gt; committing doesn’t remove them from Git's history. Here’s how you fix it properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Add the File to &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;First, make sure the file is listed in &lt;code&gt;.gitignore&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ignore config file
config/config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Remove the File from Git Tracking
&lt;/h2&gt;

&lt;p&gt;Since Git is already tracking the file, we need to &lt;strong&gt;untrack&lt;/strong&gt; it without deleting it from the local system.&lt;/p&gt;

&lt;p&gt;Run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;--cached&lt;/span&gt; config/config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ This removes it from Git &lt;strong&gt;without deleting it locally&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Commit and Push the Change
&lt;/h2&gt;

&lt;p&gt;Now, commit this change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Removed config.js from repo"&lt;/span&gt;
git push origin main  &lt;span class="c"&gt;# Change 'main' if using a different branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From now on, Git will ignore &lt;code&gt;config/config.js&lt;/code&gt;, and it won’t be included in future commits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Remove It from Git History (If Already Pushed)
&lt;/h2&gt;

&lt;p&gt;If the file was already pushed and contains sensitive data, you need to &lt;strong&gt;rewrite Git history&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git filter-branch &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--index-filter&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s1"&gt;'git rm --cached --ignore-unmatch config/config.js'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--prune-empty&lt;/span&gt; &lt;span class="nt"&gt;--tag-name-filter&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then force push the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠ &lt;strong&gt;Warning:&lt;/strong&gt; This rewrites history, so be cautious if working in a shared repository!&lt;/p&gt;




&lt;p&gt;Now your secret files are safe, and Git will ignore them in the future! 🚀&lt;/p&gt;

</description>
      <category>git</category>
      <category>gitignore</category>
      <category>vscode</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stop Wasting Memory: Use .lean() Like a Pro</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Mon, 17 Feb 2025 06:59:59 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/stop-wasting-memory-use-lean-like-a-pro-47k0</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/stop-wasting-memory-use-lean-like-a-pro-47k0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Alright, let’s talk about something that &lt;em&gt;should&lt;/em&gt; be common sense but somehow isn’t: using &lt;code&gt;.lean()&lt;/code&gt; in Mongoose. If you’ve ever written a simple query and thought, &lt;em&gt;“Why is my app using so much memory?”&lt;/em&gt;, chances are you’re not using &lt;code&gt;.lean()&lt;/code&gt;. And if you're the kind of developer who likes to flex about &lt;em&gt;performance optimizations&lt;/em&gt; but still ignores &lt;code&gt;.lean()&lt;/code&gt;, this one's for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Heck is &lt;code&gt;.lean()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Mongoose normally returns &lt;strong&gt;full-fat&lt;/strong&gt; documents, loaded with built-in magic: getters, setters, hooks, change tracking—you name it. But let’s be real: &lt;strong&gt;90% of the time, you don’t need that extra fluff&lt;/strong&gt; when you're just reading data.&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;.lean()&lt;/code&gt;, a simple method that tells Mongoose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Hey, don’t give me a fancy, bloated document. Just give me a plain JavaScript object.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And boom! You just saved memory, improved query speed, and maybe even made your API 10% less of a dumpster fire.&lt;/p&gt;

&lt;h2&gt;
  
  
  How &lt;code&gt;.lean()&lt;/code&gt; Works (With Examples)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Without &lt;code&gt;.lean()&lt;/code&gt; (The Memory Hog Approach)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;article&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;ArticlesModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;How to Waste Memory&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Output: Mongoose Document with tons of hidden properties&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "object" (but a heavy Mongoose object)&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="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Function exists! (But you never needed it, did you?)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s the problem: this returns a &lt;strong&gt;full Mongoose document&lt;/strong&gt;, packed with hidden features like &lt;code&gt;.save()&lt;/code&gt;, &lt;code&gt;.validate()&lt;/code&gt;, and &lt;strong&gt;other things you will never use in a read operation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;With &lt;code&gt;.lean()&lt;/code&gt; (The Smart Way)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;article&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;ArticlesModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;How to Optimize Performance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;lean&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Output: { _id: "abc123", title: "How to Optimize Performance" }&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "object" (plain JavaScript object)&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="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// undefined (because you never needed it!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Boom! Faster, lighter, and without unnecessary Mongoose baggage.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;.lean()&lt;/code&gt; Makes Queries Faster&lt;/strong&gt; ⚡&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Mongoose documents &lt;strong&gt;come with extra processing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.lean()&lt;/code&gt; &lt;strong&gt;skips that overhead&lt;/strong&gt; and returns raw JSON objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;.lean()&lt;/code&gt; Saves Memory&lt;/strong&gt; 🧠&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mongoose docs &lt;strong&gt;retain a reference to the database&lt;/strong&gt; (more memory).&lt;/li&gt;
&lt;li&gt;Plain objects? &lt;strong&gt;Lighter, easier to work with, and don’t bloat your app.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Avoids Unnecessary Features&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you need &lt;code&gt;.save()&lt;/code&gt; on a read query? &lt;strong&gt;No.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Do you need schema validation on an already stored document? &lt;strong&gt;Nope.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Do you need virtuals? &lt;strong&gt;Then don’t use &lt;code&gt;.lean()&lt;/code&gt; (more on this below).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When NOT to Use &lt;code&gt;.lean()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I get it—&lt;code&gt;.lean()&lt;/code&gt; sounds like magic. But don’t get &lt;strong&gt;too excited&lt;/strong&gt;; it’s not always the right choice. Here’s when you &lt;strong&gt;shouldn’t&lt;/strong&gt; use it:&lt;/p&gt;

&lt;p&gt;🚨 &lt;strong&gt;If You Need Schema Features (Virtuals, Hooks, Middleware)&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&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="na"&gt;toJSON&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;virtuals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;userSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fullName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstName&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;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastName&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;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&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;UserModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;lean&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// undefined (because `.lean()` removes virtuals!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Solution?&lt;/strong&gt; Don’t use &lt;code&gt;.lean()&lt;/code&gt; if you need schema-based transformations.&lt;/p&gt;

&lt;p&gt;🚨 &lt;strong&gt;If You Need to Modify and Save the Document&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&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;UserModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&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;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;lean&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ❌ ERROR! save() doesn't exist on plain objects.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Solution?&lt;/strong&gt; If you plan to update and save the document, skip &lt;code&gt;.lean()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The TL;DR for Lazy Developers
&lt;/h2&gt;

&lt;p&gt;✅ Use &lt;code&gt;.lean()&lt;/code&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You only need to &lt;strong&gt;read&lt;/strong&gt; data.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;faster, lightweight queries&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You don’t need &lt;code&gt;.save()&lt;/code&gt;, hooks, or virtuals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⛔ Don’t use &lt;code&gt;.lean()&lt;/code&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;virtuals, middleware, or hooks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You’re going to &lt;strong&gt;modify and save&lt;/strong&gt; the document.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Mongoose is great, but &lt;strong&gt;blindly using full documents everywhere is just bad practice&lt;/strong&gt;. If your app is sluggish or consuming too much memory, &lt;code&gt;.lean()&lt;/code&gt; is a &lt;strong&gt;simple, one-line fix&lt;/strong&gt; that can make a big difference.&lt;/p&gt;

&lt;p&gt;So next time someone asks &lt;em&gt;“Why is our API so slow?”&lt;/em&gt;, just reply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Did you use &lt;code&gt;.lean()&lt;/code&gt;?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if they say no, well… you know who to blame. 😎&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mongodb</category>
      <category>productivity</category>
      <category>mongoose</category>
    </item>
    <item>
      <title>Self-Updating Widgets (No Manual Changes!)</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Fri, 07 Feb 2025 10:56:52 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/self-updating-widgets-no-manual-changes-400i</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/self-updating-widgets-no-manual-changes-400i</guid>
      <description>&lt;p&gt;💡 &lt;strong&gt;Problem:&lt;/strong&gt; What if you release an update, but users have already embedded an old version?&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Solution:&lt;/strong&gt; Use a versioning system in your script URL:&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;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.yourdomain.com/widget.js?v=2.0.1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, &lt;strong&gt;force fresh loads&lt;/strong&gt; by appending a timestamp:&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;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.yourdomain.com/widget.js?t="&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="na"&gt;Date.now&lt;/span&gt;&lt;span class="err"&gt;()&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures &lt;strong&gt;no cache issues&lt;/strong&gt; and always loads the latest version. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>widget</category>
      <category>howto</category>
    </item>
    <item>
      <title>Serving a Widget Using Node.js 🚀</title>
      <dc:creator>shruti jain</dc:creator>
      <pubDate>Fri, 07 Feb 2025 10:46:28 +0000</pubDate>
      <link>https://dev.to/shruti_jain_98b67e0d65330/serving-a-widget-using-nodejs-9d9</link>
      <guid>https://dev.to/shruti_jain_98b67e0d65330/serving-a-widget-using-nodejs-9d9</guid>
      <description>&lt;p&gt;Widgets—those little UI elements like chat popups and notifications—are super handy. Here’s a quick way to &lt;strong&gt;build and serve a widget&lt;/strong&gt; using Node.js, making it embeddable with a simple &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.  &lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Set Up the Server
&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;widget-server &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;widget-server  
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;  
npm &lt;span class="nb"&gt;install &lt;/span&gt;express  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;server.js&lt;/code&gt;:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&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;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;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/widget&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&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="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;widget.html&lt;/span&gt;&lt;span class="dl"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/embed.js&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;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&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="s1"&gt;application/javascript&lt;/span&gt;&lt;span class="dl"&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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
        (function() {
            let iframe = document.createElement('iframe');
            iframe.src = 'http://localhost:&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;/widget';
            iframe.style = 'width:320px;height:200px;border:none;position:fixed;bottom:20px;right:20px;z-index:9999;';
            document.body.appendChild(iframe);
        })();
    `&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="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 at http://localhost:&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;
  
  
  2️⃣ Create the Widget
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;widget.html&lt;/code&gt;:&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Widget&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#007BFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;My Widget&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;Click Me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3️⃣ Embed It Anywhere
&lt;/h3&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;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:3000/embed.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the server:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will load the widget inside an iframe on any webpage. 🚀****&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>widgets</category>
      <category>node</category>
    </item>
  </channel>
</rss>
