<?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: Anjan Talatam</title>
    <description>The latest articles on DEV Community by Anjan Talatam (@anjantalatam).</description>
    <link>https://dev.to/anjantalatam</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%2F915652%2F4d80eab4-ffe1-422c-b0ff-bbc77daed7dd.png</url>
      <title>DEV Community: Anjan Talatam</title>
      <link>https://dev.to/anjantalatam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anjantalatam"/>
    <language>en</language>
    <item>
      <title>React / Next JS error fix</title>
      <dc:creator>Anjan Talatam</dc:creator>
      <pubDate>Tue, 14 Nov 2023 10:21:50 +0000</pubDate>
      <link>https://dev.to/anjantalatam/react-next-js-error-fix-1ap6</link>
      <guid>https://dev.to/anjantalatam/react-next-js-error-fix-1ap6</guid>
      <description>&lt;p&gt;Error&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'SomeComponent' cannot be used as a JSX component.
  Its type '(props: ISomeComponentProps) =&amp;gt; JSX.Element' is not a valid JSX element type.
    Type '(props: ISomeComponentProps) =&amp;gt; JSX.Element' is not assignable to type '(props: any, deprecatedLegacyContext?: any) =&amp;gt; ReactNode'.
      Type 'Element' is not assignable to type 'ReactNode'.
        Property 'children' is missing in type 'Element' but 
          required in type 'ReactPortal'.ts(2786)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to tsconfig.json&lt;/li&gt;
&lt;li&gt;Add the following code under compiler options
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="s2"&gt;"./node_modules/@types/react"&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;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;Here is how compiler options should look like post-changes&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;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allowJs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skipLibCheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="s2"&gt;"./node_modules/@types/react"&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;span class="p"&gt;}&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;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;It is telling the typescript compiler that when it encounters a reference to the &lt;code&gt;react&lt;/code&gt; module, it should look for the actual implementation in the &lt;code&gt;./node_modules/@types/react&lt;/code&gt; directory.&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How to handle unmatched routes with serverless</title>
      <dc:creator>Anjan Talatam</dc:creator>
      <pubDate>Sat, 21 Oct 2023 12:26:58 +0000</pubDate>
      <link>https://dev.to/anjantalatam/how-to-handle-unmatched-routes-with-serverless-1fgm</link>
      <guid>https://dev.to/anjantalatam/how-to-handle-unmatched-routes-with-serverless-1fgm</guid>
      <description>&lt;h2&gt;
  
  
  Context:
&lt;/h2&gt;

&lt;p&gt;I mistakenly misspelled my login route as &lt;code&gt;/dev/loginn&lt;/code&gt; instead of &lt;code&gt;/dev/login&lt;/code&gt; on Postman, here is the response&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;"currentRoute"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post - /dev/loginn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Serverless-offline: route not found."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"existingRoutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;404&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;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;The above response has 2 major issues&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Existing routes are getting exposed which shouldn't be (ideally).&lt;/li&gt;
&lt;li&gt;The response is too detailed. We need to keep it simple.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;Add a new Lambda function to handle unmatched/ unconfigured Routes in &lt;code&gt;serverless.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;#serverless.yml&lt;/span&gt;

&lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;unmatchedRoute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;handler.unmatchedRoute&lt;/span&gt;
    &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/{proxy+}&lt;/span&gt;
          &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ANY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// handler.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Handler&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-lambda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unmatchedRoute&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="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&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="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;404 page 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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading! Drop a like if you found it helpful ❤️&lt;/p&gt;

&lt;p&gt;Cheers! &lt;a href="https://www.linkedin.com/in/anjantalatam/"&gt;Anjan Talatam&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ignore from here&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SEO&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to handle unconfigured routes with serverless&lt;/li&gt;
&lt;li&gt;How to handle unmatched routes for AWS lambda functions&lt;/li&gt;
&lt;li&gt;How to handle unconfigured routes for AWS lambda functions &lt;/li&gt;
&lt;li&gt;How to handle unconfigured routes for AWS lambda functions with serverless&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>lambda</category>
      <category>functions</category>
    </item>
    <item>
      <title>Can we use useQuery for POST request</title>
      <dc:creator>Anjan Talatam</dc:creator>
      <pubDate>Mon, 18 Sep 2023 15:36:22 +0000</pubDate>
      <link>https://dev.to/anjantalatam/can-we-use-usequery-for-post-request-111</link>
      <guid>https://dev.to/anjantalatam/can-we-use-usequery-for-post-request-111</guid>
      <description>&lt;h2&gt;
  
  
  Yes
&lt;/h2&gt;

&lt;p&gt;use &lt;code&gt;useQuery()&lt;/code&gt; if you are fetching data from the server. ( irrespective of methods GET/ POST )&lt;/p&gt;

&lt;p&gt;use &lt;code&gt;useMutation()&lt;/code&gt; if you are modifying data on the server.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Back story 💭&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am under a misconception, that useQuery is only for GET requests and all other requests ( POST, PUT, DELETE ) are handled by useMutation.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1703786481230528777-341" src="https://platform.twitter.com/embed/Tweet.html?id=1703786481230528777"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1703786481230528777-341');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1703786481230528777&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;But as mentioned in the above tweet I got the below case.&lt;/p&gt;

&lt;p&gt;Need to fetch data using a POST request.&lt;/p&gt;

&lt;p&gt;Initially, I invoked useMutation on the mount with useEffect. ( To get the Data )&lt;/p&gt;

&lt;p&gt;and never used thereafter in the code to mutate any data.&lt;/p&gt;

&lt;p&gt;This looked like a useQuery material!&lt;/p&gt;

&lt;p&gt;Upon searching &lt;code&gt;Can we use useQuery for POST requests&lt;/code&gt;, I didn't find a direct blog/ article but on &lt;a href="https://tanstack.com/query/v4/docs/react/guides/queries"&gt;reading through the DOCS&lt;/a&gt; found that we can use useQuery for POST requests as well and got a much neater understanding on what useQuery and useMutation are meant for.&lt;/p&gt;

&lt;p&gt;If you got a similar use case go ahead and use useQuery ✅&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactquery</category>
      <category>usequery</category>
    </item>
    <item>
      <title>How to handle unregistered routes in Next JS API</title>
      <dc:creator>Anjan Talatam</dc:creator>
      <pubDate>Fri, 25 Aug 2023 08:28:15 +0000</pubDate>
      <link>https://dev.to/anjantalatam/how-to-handle-unregistered-routes-in-next-js-api-3gl5</link>
      <guid>https://dev.to/anjantalatam/how-to-handle-unregistered-routes-in-next-js-api-3gl5</guid>
      <description>&lt;p&gt;By default unregistered api routes fallback to below screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c5Qysfot--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rc6uv8dnxjxw8qn3g1ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c5Qysfot--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rc6uv8dnxjxw8qn3g1ur.png" alt="Default handling of unregistered routes" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can handle this by using &lt;a href="https://nextjs.org/docs/pages/building-your-application/routing/dynamic-routes#catch-all-segments"&gt;Catch-all Segments in Next&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;/api&lt;/code&gt; folder create a file &lt;code&gt;[...rest].tsx&lt;/code&gt; Give it a name of your choice. ( here rest refers to rest of the routes )&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wRaxwrae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kf6ixzekc6wbmmmq4fn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wRaxwrae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kf6ixzekc6wbmmmq4fn.png" alt="Folder structure NextJS API" width="362" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now all unregistered routes can be handled in this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// [...rest].tsx&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;handler&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;NextApiRequest&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;NextApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&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;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="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;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;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y0zFtRu6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1xu7795ist9cv18tgra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y0zFtRu6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1xu7795ist9cv18tgra.png" alt="handle unregistered routes" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/p/sandbox/next-handle-unhandled-routes-pdfdqn?file=/pages/api/[...rest].tsx"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1rJFNpIB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://codesandbox.io/static/img/play-codesandbox.svg" alt="Edit" width="201" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>api</category>
      <category>routing</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
