<?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: Pranav - (pranavb.xyz)</title>
    <description>The latest articles on DEV Community by Pranav - (pranavb.xyz) (@pranavbobde).</description>
    <link>https://dev.to/pranavbobde</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F722023%2Feb322e3f-a643-499b-b2d9-ff1a4995cb10.png</url>
      <title>DEV Community: Pranav - (pranavb.xyz)</title>
      <link>https://dev.to/pranavbobde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pranavbobde"/>
    <language>en</language>
    <item>
      <title>Why GPT Models Sucked At UI</title>
      <dc:creator>Pranav - (pranavb.xyz)</dc:creator>
      <pubDate>Wed, 22 Jul 2026 11:16:36 +0000</pubDate>
      <link>https://dev.to/pranavbobde/maybe-gpt-wasnt-the-ui-problem-38ag</link>
      <guid>https://dev.to/pranavbobde/maybe-gpt-wasnt-the-ui-problem-38ag</guid>
      <description>&lt;p&gt;I had this default belief for a while:&lt;/p&gt;

&lt;p&gt;Claude/Opus for UI.&lt;br&gt;
Codex/GPT for code.&lt;/p&gt;

&lt;p&gt;And honestly, I think a lot of devs had some version of that in their head too.&lt;/p&gt;

&lt;p&gt;Claude Code usually felt more tasteful.&lt;br&gt;
Codex frontend output had that same repeated smell:&lt;/p&gt;

&lt;p&gt;cards everywhere,&lt;br&gt;
generic dashboard polish,&lt;br&gt;
same-ish layouts,&lt;br&gt;
same-ish "AI app" vibe.&lt;/p&gt;

&lt;p&gt;So the easy conclusion was:&lt;/p&gt;

&lt;p&gt;GPT just sucks at UI.&lt;/p&gt;

&lt;p&gt;But after watching &lt;a href="https://www.youtube.com/watch?v=Noo0NWD0gHU" rel="noopener noreferrer"&gt;Theo's video&lt;/a&gt; and checking &lt;a href="https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json" rel="noopener noreferrer"&gt;OpenAI's own Codex model manifest&lt;/a&gt;, I don't think that explanation is clean enough anymore.&lt;/p&gt;

&lt;p&gt;GPT-5.5 inside Codex had a huge frontend guidance block sitting in the harness.&lt;/p&gt;

&lt;p&gt;Not just "make the UI good".&lt;/p&gt;

&lt;p&gt;Actual rules around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;card radius&lt;/li&gt;
&lt;li&gt;icon choices&lt;/li&gt;
&lt;li&gt;hero layouts&lt;/li&gt;
&lt;li&gt;color constraints&lt;/li&gt;
&lt;li&gt;button behavior&lt;/li&gt;
&lt;li&gt;visual assets&lt;/li&gt;
&lt;li&gt;what kind of UI patterns to avoid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That stuff should not be global hidden law.&lt;/p&gt;

&lt;p&gt;"Use icons" depends on the product.&lt;br&gt;
"Don't make this kind of hero" depends on the page.&lt;br&gt;
"Cards should be this radius" is not something every repo should inherit because a model manifest said so.&lt;/p&gt;

&lt;p&gt;So when people say "GPT has bad UI taste", the fairer question is:&lt;/p&gt;

&lt;p&gt;what exactly did Codex tell it to do before my prompt even started?&lt;/p&gt;

&lt;h2&gt;
  
  
  The part people keep mixing up
&lt;/h2&gt;

&lt;p&gt;When we compare Claude Code vs Codex, we are usually not comparing just model intelligence.&lt;/p&gt;

&lt;p&gt;We are comparing the full harness around the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system prompt&lt;/li&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;project instructions&lt;/li&gt;
&lt;li&gt;repo context&lt;/li&gt;
&lt;li&gt;compaction&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;product defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same model in a different harness can feel like a different product.&lt;/p&gt;

&lt;p&gt;That is why Theo's experiment was interesting to me.&lt;/p&gt;

&lt;p&gt;He ran GPT-5.6 Sol through a Claude Code-like setup using &lt;a href="https://github.com/router-for-me/CLIProxyAPI" rel="noopener noreferrer"&gt;CLIProxyAPI&lt;/a&gt;, and the output looked much better than the usual Codex UI reputation would make you expect.&lt;/p&gt;

&lt;p&gt;Not a perfect benchmark.&lt;/p&gt;

&lt;p&gt;Still useful.&lt;/p&gt;

&lt;p&gt;Because it separates two things people usually collapse into one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model capability&lt;/li&gt;
&lt;li&gt;harness behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, GPT is clearly not helpless at React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactbench.com/" rel="noopener noreferrer"&gt;ReactBench&lt;/a&gt; currently has GPT models scoring extremely well on realistic React tasks.&lt;/p&gt;

&lt;p&gt;So the model being bad at React is not the clean explanation.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  One caveat before this becomes too dramatic
&lt;/h2&gt;

&lt;p&gt;I checked the current public Codex manifest again before updating this post.&lt;/p&gt;

&lt;p&gt;The old GPT-5.5 entry still has that frontend block.&lt;/p&gt;

&lt;p&gt;The current GPT-5.6 Sol entry does not seem to have that exact same block in the public manifest.&lt;/p&gt;

&lt;p&gt;So I am not claiming the latest ChatGPT/Codex app still behaves exactly like old GPT-5.5 Codex.&lt;/p&gt;

&lt;p&gt;That would need separate product-level proof.&lt;/p&gt;

&lt;p&gt;What I am saying is simpler:&lt;/p&gt;

&lt;p&gt;this was real public Codex config, and it is a very good example of how much the wrapper around a model can change the model's perceived taste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also, check your own prompt files
&lt;/h2&gt;

&lt;p&gt;And since this whole thing is basically about prompts steering models, this is a good time to look at your own setup too.&lt;/p&gt;

&lt;p&gt;Open your &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, custom instructions, and skills.&lt;/p&gt;

&lt;p&gt;Not as some productivity ritual.&lt;/p&gt;

&lt;p&gt;For the same reason this Codex thing matters:&lt;/p&gt;

&lt;p&gt;hidden instructions steer outputs.&lt;/p&gt;

&lt;p&gt;A rule you added six months ago because GPT-4 kept doing something annoying might be actively hurting a newer model now.&lt;/p&gt;

&lt;p&gt;A giant &lt;code&gt;CLAUDE.md&lt;/code&gt; that keeps repeating old architecture notes, dead commands, stale style opinions, and random preferences is not harmless.&lt;/p&gt;

&lt;p&gt;It is context.&lt;/p&gt;

&lt;p&gt;It is steering.&lt;/p&gt;

&lt;p&gt;Claude's own docs say &lt;code&gt;CLAUDE.md&lt;/code&gt; gets loaded into context, and that memory works better when instructions are specific, concise, and periodically reviewed.&lt;/p&gt;

&lt;p&gt;So yeah, go look at yours.&lt;/p&gt;

&lt;p&gt;I would bet a lot of people have rotten agent files they have not read in months.&lt;/p&gt;

&lt;p&gt;And then we blame the model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources I checked
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Noo0NWD0gHU" rel="noopener noreferrer"&gt;Theo's video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json" rel="noopener noreferrer"&gt;OpenAI Codex model manifest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/fd51e505401b7b2da958edc269e4d7280be86bd5/codex-rs/models-manager/models.json" rel="noopener noreferrer"&gt;Current manifest snapshot I checked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json" rel="noopener noreferrer"&gt;GPT-5.5 frontend block&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reactbench.com/" rel="noopener noreferrer"&gt;ReactBench&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code/memory" rel="noopener noreferrer"&gt;Claude Code memory docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude.com/blog/lessons-from-building-claude-code-prompt-caching-is-everything" rel="noopener noreferrer"&gt;Claude Code prompt caching post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/router-for-me/CLIProxyAPI" rel="noopener noreferrer"&gt;CLIProxyAPI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>gpt</category>
      <category>codex</category>
      <category>react</category>
    </item>
    <item>
      <title>Hoisting Isn't Even Real</title>
      <dc:creator>Pranav - (pranavb.xyz)</dc:creator>
      <pubDate>Sat, 20 May 2023 08:51:29 +0000</pubDate>
      <link>https://dev.to/pranavbobde/hoisting-isnt-even-real-1obb</link>
      <guid>https://dev.to/pranavbobde/hoisting-isnt-even-real-1obb</guid>
      <description>&lt;p&gt;One of the most famous interview topics - HOISTING, isn't even real.&lt;/p&gt;

&lt;p&gt;Yes, you heard that right.&lt;/p&gt;

&lt;p&gt;The word '&lt;strong&gt;hoist&lt;/strong&gt;' wasn't even used in the official ECMAScript specifications until the year &lt;strong&gt;&lt;em&gt;2015&lt;/em&gt;&lt;/strong&gt;. It was first mentioned in the &lt;strong&gt;ECMAScript 6&lt;/strong&gt; specification, which was published in June of that year.&lt;/p&gt;

&lt;h2&gt;
  
  
  DEFINITION
&lt;/h2&gt;

&lt;p&gt;If you search on Google, this is what you get&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JavaScript Hoisting refers to the process whereby the interpreter appears to move the declaration of functions, variables or classes to the top of their scope, before the execution of the code. Hoisting is not a term normatively defined in the ECMAScript specification.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Please refer to it &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Hoisting#:~:text=JavaScript%20Hoisting%20refers%20to%20the,defined%20in%20the%20ECMAScript%20specification" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And even there they've correctly mentioned that &lt;code&gt;Hoisting is not a term normatively defined in the ECMAScript specification.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MISINFORMATION
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;shinobi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;sensei&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;shinobi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// line 3&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sensei&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kakashi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// line 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, based on the definition of hoisting, JS should be able to anticipate all variable declarations, as seen in lines 3 and 4, regardless of their position within the scope and move them to the top of the scope before the code execution begins.&lt;/p&gt;

&lt;p&gt;Something 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="c1"&gt;// before execution&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;shinobi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sensei&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;shinobi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;sensei&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;shinobi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;sensei&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kakashi&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;Which is not what happens.&lt;/p&gt;

&lt;p&gt;JavaScript doesn't move things around the way we might expect it to. Because how would it magically be able to look ahead &amp;amp; find only the declarations in the very first pass?&lt;/p&gt;

&lt;p&gt;To be able to do that, you would need to perform complex processing on later tokens in the code block until reaching its end. And theoretically extract any declarations if any are encountered and move them to the top. And guess what that magical processing's called - &lt;strong&gt;PARSING!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, Hoisting is just a shorthand, a convenient explanation to describe this magical behavior without getting into the nitty-gritty details.&lt;/p&gt;

&lt;h2&gt;
  
  
  REASON
&lt;/h2&gt;

&lt;p&gt;All this misunderstanding occurs because JS execution is a 2-pass process i.e. parsing/compilation &amp;amp; execution. But people tend to think of JS execution as one pass process rather than two.&lt;/p&gt;

&lt;p&gt;If you think of it as 2 passes. You can easily explain this magical behavior with the help of &lt;strong&gt;&lt;em&gt;Lexical Scope.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, I can't cover it now because of the vastness of the topic but you may refer &lt;a href="https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch2.md" rel="noopener noreferrer"&gt;this&lt;/a&gt; as the best resource.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Function Scopes and IIFE Pattern</title>
      <dc:creator>Pranav - (pranavb.xyz)</dc:creator>
      <pubDate>Tue, 09 May 2023 19:20:19 +0000</pubDate>
      <link>https://dev.to/pranavbobde/function-scopes-and-iife-pattern-6p7</link>
      <guid>https://dev.to/pranavbobde/function-scopes-and-iife-pattern-6p7</guid>
      <description>&lt;h3&gt;
  
  
  WHY
&lt;/h3&gt;

&lt;p&gt;Consider you've written code like the below at some point. We've declared a var and hope that it still has the same value. Well, right now it looks good.&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;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Naruto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But say after a few months a jr. dev comes along and unknowing try to make a change 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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sasuke&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sasuke&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sasuke -- oops!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, you can easily see the issue here.&lt;br&gt;
We have a naming collision problem.&lt;/p&gt;

&lt;p&gt;You may think, we should just use const there. But the problem is not if the variable can be reassigned (because the developer if not aware could just modify your const to var anyways) but we have a naming collision problem.&lt;/p&gt;

&lt;p&gt;So, the problem is: We have a problem where 2 different people wanna use the same semantic name for their purposes.&lt;/p&gt;
&lt;h3&gt;
  
  
  PSEUDO FIX
&lt;/h3&gt;

&lt;p&gt;Since the problem could be thought of as mainly arising due to the declaration of the variable in the same scope. So, the natural fix coming to mind would be, to make use of different scopes, and one simple way to do so could be by wrapping a function around it.&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;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Naruto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anotherNinja&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sasuke&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sasuke&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;anotherNinja&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Naruto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, now those vars don't seem to collide anymore and the code seems to work well. But now the problem is, we have a named function in the same scope.&lt;/p&gt;

&lt;p&gt;So it seems, we didn't solve the name collision problem, we just shifted it to a different variable name.&lt;/p&gt;

&lt;h3&gt;
  
  
  REAL FIX - IIFE
&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;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Naruto&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anotherNinja&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sasuke&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Sasuke&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;ninja&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Naruto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, this code pattern you see is called an IIFE pattern i.e. Immediately Invoking Function Expression, which does exactly what it sounds like.&lt;/p&gt;

&lt;p&gt;Using IIFE, we're creating a new scope and immediately invoking it.&lt;/p&gt;

&lt;p&gt;Another use case: when you want to turn statements into expressions&lt;/p&gt;

&lt;p&gt;Consider below example:&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;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&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="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetchNinja&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="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;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;If you wanna do something like this, since &lt;code&gt;try-catch&lt;/code&gt; is a statement it doesn't work in an expression position.&lt;br&gt;
You can do something 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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&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="nx"&gt;ninja&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetchNinja&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="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;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;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Try to follow "&lt;strong&gt;The principle of least privilege&lt;/strong&gt;" whenever possible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The principle of least privilege is the idea that any user, program, or process should have only the bare minimum privileges necessary to perform its function.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Leverage the power of function scopes and IIFE patterns to enjoy the benefits of the principle like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Avoid naming collisions&lt;/li&gt;
&lt;li&gt;Restrict code access&lt;/li&gt;
&lt;li&gt;Ability to freely refactor code&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>functional</category>
      <category>programming</category>
    </item>
    <item>
      <title>API Gateway Responses and Handling Authorizer Responses</title>
      <dc:creator>Pranav - (pranavb.xyz)</dc:creator>
      <pubDate>Thu, 04 May 2023 01:44:39 +0000</pubDate>
      <link>https://dev.to/pranavbobde/api-gateway-responses-and-handling-authorizer-responses-2bkg</link>
      <guid>https://dev.to/pranavbobde/api-gateway-responses-and-handling-authorizer-responses-2bkg</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I have added a &lt;strong&gt;token-based Lambda Authorizer&lt;/strong&gt; for all my backend services deployed on API Gateway. I wanted the user to be signed out if the authorizer responds with a &lt;strong&gt;401&lt;/strong&gt; (Unauthorized) or &lt;strong&gt;403&lt;/strong&gt; (Access Denied) error.&lt;/p&gt;

&lt;p&gt;This is how my code looked like for the authorizer lambda:&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;jwt&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;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorizationToken&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unauthorized&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return a 401 Unauthorized response&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="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SECRET&lt;/span&gt;&lt;span class="p"&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;data&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;if &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="c1"&gt;// Return a 403 Access Denied response&lt;/span&gt;
      &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;generatePolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&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;Deny&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methodArn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageString&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid token&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="k"&gt;return&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="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;generatePolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&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;Allow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methodArn&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="c1"&gt;// Help function to generate an IAM policy&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generatePolicy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resource&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

  &lt;span class="nx"&gt;authResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;principalId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;principalId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;effect&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;resource&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;policyDocument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="nx"&gt;policyDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2012-10-17&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;policyDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="o"&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;statementOne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="nx"&gt;statementOne&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;execute-api:Invoke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;statementOne&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;statementOne&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;policyDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Statement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;statementOne&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;authResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;policyDocument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;policyDocument&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Optional output with custom properties of the String, Number or Boolean type.&lt;/span&gt;
  &lt;span class="nx"&gt;authResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="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;return&lt;/span&gt; &lt;span class="nx"&gt;authResponse&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;After this, I used to get error logs on my client apps, but I could not access the response object to check the response's status code. &lt;/p&gt;

&lt;p&gt;I needed to determine if an error was caused by my authorizer (resulting in a 401 or 403 status code) or by my API endpoint lambdas. The issue was that the response was being caught as a &lt;u&gt;fetch error&lt;/u&gt; in the &lt;u&gt;catch block&lt;/u&gt; instead of returning a response with the expected status code and message that I could handle properly.&lt;/p&gt;

&lt;p&gt;Additionally, I guess it was even giving me a &lt;strong&gt;CORS&lt;/strong&gt; error, which I wasn't able to understand why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;After quite a bit of searching, I found out that to receive proper handleable responses, I would need to configure the &lt;u&gt;&lt;strong&gt;API Gateway Responses&lt;/strong&gt;&lt;/u&gt; section in the API Gateway.&lt;/p&gt;

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

&lt;p&gt;Here, you can see all of the responses the API Gateway is capable of handling.&lt;/p&gt;

&lt;p&gt;Add the &lt;strong&gt;CORS headers&lt;/strong&gt; in the response header to receive proper handleable responses and configure the response templates as you need.&lt;/p&gt;

&lt;p&gt;In my case, this is how I configured my Access Denied:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;#Note&lt;/strong&gt;: Here, the &lt;code&gt;messageString&lt;/code&gt; comes from the context data that we are sending from our &lt;strong&gt;Authorizer function&lt;/strong&gt; that we defined previously.&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="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="k"&gt;if &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="c1"&gt;// Return a 403 Access Denied response&lt;/span&gt;
  &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;generatePolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&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;Deny&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methodArn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageString&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="nx"&gt;authResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  For more info:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gatewayResponse-definition.html#api-gateway-gatewayResponse-definition" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gatewayResponse-definition.html#api-gateway-gatewayResponse-definition&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>apigateway</category>
      <category>help</category>
      <category>node</category>
    </item>
  </channel>
</rss>
