在尝试获取JSON数据时,在Next.js 13.4应用中出现了CORS错误。

huangapple go评论59阅读模式
英文:

Getting Cors error in next js 13.4 app when trying to fetch json data

问题

以下是您提供的代码的中文翻译部分:

这是实际获取请求的搜索/页面位置

import { useSearchParams } from "next/navigation";
import Footer from "../components/Footers";
import Header from "../components/header";

import { format } from "date-fns";
import InfoCard from "../components/InfoCard";
import Image from "next/image";

export default async function Search() {
  const searchParams = useSearchParams();
  const locations = searchParams.get("locations");
  const startDate = searchParams.get("startDate");
  const endDate = searchParams.get("endDate");
  const noOfGuests = searchParams.get("noOfGuests");
  const formatStartDate = format(new Date(startDate), "dd MMMM");
  const formatEndDate = format(new Date(endDate), "dd MMMM");
  const days = `${formatStartDate} - ${formatEndDate}`;

  const resultss = await fetch("https://www.jsonkeeper.com/b/YVMX", {
    method: 'GET',
  });

  const resultsss = await resultss.json();
  console.log(resultsss);

  return (
    <div>
      <Header
        placeholder={`${locations}  | ${days} | ${noOfGuests} guest(s)`}
      />
      <main className="mx-3">
        <p className="text-xs md:text-sm mt-3">
          50+ Stays {days} for {noOfGuests} guest(s)
        </p>
        <h1 className="text-lg  md:text-2xl  font-bold mt-2 mb-5">
          Stays in {locations}
        </h1>
        <div className="mb-5 mr-3">
          <button className="text-xs  md:text-sm rounded-full px-3 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2  ">
            Free Cancellation
          </button>
          <button className="text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   ">
            Type of place
          </button>
          <button className="text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   ">
            Price
          </button>
          <button className="text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   ">
            Dormitory
          </button>
          <button className="text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2  ">
            More filters
          </button>
        </div>
        <div className=" ">
          {resultsss?.map(
            ({
              img,
              key,
              location,
              title,
              description,
              star,
              price,
              total,
            }) => (
              <InfoCard
                key={total}
                img={img}
                location={location}
                title={title}
                description={description}
                star={star}
                price={price}
                total={total}
              />
            )
          )}
        </div>
      </main>
      <Footer />
    </div>
  );
}

希望这有助于您的学习项目!如果您有任何其他问题或需要进一步的帮助,请随时提问。

英文:

Here is the search/page where actual fetch request is situated.

import { useSearchParams } from &quot;next/navigation&quot;;
import Footer from &quot;../components/Footers&quot;;
import Header from &quot;../components/header&quot;;
import { format } from &quot;date-fns&quot;;
import InfoCard from &quot;../components/InfoCard&quot;;
import Image from &quot;next/image&quot;;
// export default async function searchRes() {
// };
// const searchRes = async () =&gt; {
//   const resultss = await fetch(&quot;https://www.jsonkeeper.com/b/YVMX&quot;);
//   const resultsss = await resultss.json();
//   return resultsss;
// };
export default async function Search() {
// const resultsss = await searchRes();
const searchParams = useSearchParams();
const locations = searchParams.get(&quot;locations&quot;);
const startDate = searchParams.get(&quot;startDate&quot;);
const endDate = searchParams.get(&quot;endDate&quot;);
const noOfGuests = searchParams.get(&quot;noOfGuests&quot;);
const formatStartDate = format(new Date(startDate), &quot;dd MMMM&quot;);
const formatEndDate = format(new Date(endDate), &quot;dd MMMM&quot;);
const days = `${formatStartDate} - ${formatEndDate}`;
const resultss = await fetch(&quot;https://www.jsonkeeper.com/b/YVMX&quot;
, {
method: &#39;GET&#39;,
// mode: &#39;no-cors&#39;,
// headers: {
//   &quot;Access-Control-Allow-Headers&quot; : &quot;Content-Type&quot;,
//   &quot;Access-Control-Allow-Origin&quot;: &quot;*&quot;,
//   &quot;Access-Control-Allow-Methods&quot;: &quot;OPTIONS,POST,GET&quot;,
// },
}
)
// .then((res)=&gt;res.json);
const resultsss = await resultss.json();
console.log(resultsss);
// const resultsss = await resultss();
// const resultsss = await searchRes();
return (
&lt;div&gt;
&lt;Header
placeholder={`${locations}  | ${days} | ${noOfGuests} guest(s)`}
/&gt;
&lt;main className=&quot;mx-3&quot;&gt;
&lt;p className=&quot;text-xs md:text-sm mt-3&quot;&gt;
50+ Stays {days} for {noOfGuests} guest(s)
&lt;/p&gt;
&lt;h1 className=&quot;text-lg  md:text-2xl  font-bold mt-2 mb-5&quot;&gt;
Stays in {locations}
&lt;/h1&gt;
&lt;div className=&quot;mb-5 mr-3&quot;&gt;
&lt;button className=&quot;text-xs  md:text-sm rounded-full px-3 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2  &quot;&gt;
Free Cancellation
&lt;/button&gt;
&lt;button className=&quot;text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   &quot;&gt;
Type of place
&lt;/button&gt;
&lt;button className=&quot;text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   &quot;&gt;
Price
&lt;/button&gt;
&lt;button className=&quot;text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2   &quot;&gt;
Dormitory
&lt;/button&gt;
&lt;button className=&quot;text-xs md:text-sm rounded-full px-2 py-2 border-gray-300 border hover:shadow-md  active:bg-slate-100 mr-2 mb-2  &quot;&gt;
More filters
&lt;/button&gt;
&lt;/div&gt;
&lt;div className=&quot; &quot;&gt;
{resultsss?.map(
({
img,
key,
location,
title,
description,
star,
price,
total,
}) =&gt; (
&lt;InfoCard
key={total}
img={img}
location={location}
title={title}
description={description}
star={star}
price={price}
total={total}
/&gt;
)
)}
&lt;/div&gt;
&lt;/main&gt;
&lt;Footer /&gt;
&lt;/div&gt;
);
}
// export default Search;
// https://jsonkeeper.com/b/Z5I9
// for indian currency https://www.jsonkeeper.com/b/YVMX
// https://cors-anywhere.herokuapp.com/

Next.config

const nextConfig = {};
module.exports = {
async headers() {
return [
{
// matching all API routes
source: &quot;/api/:path*&quot;,
headers: [
{ key: &quot;Access-Control-Allow-Credentials&quot;, value: &quot;true&quot; },
{ key: &quot;Access-Control-Allow-Origin&quot;, value: &quot;*&quot; },
{
key: &quot;Access-Control-Allow-Methods&quot;,
value: &quot;GET,OPTIONS,PATCH,DELETE,POST,PUT&quot;,
},
{
key: &quot;Access-Control-Allow-Headers&quot;,
value:
&quot;X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version&quot;,
},
],
},
];
},
images: {
domains: [&quot;links.papareact.com&quot;],
},
};
nextConfig;

Everything is working fine when cors extension is enabled on chrome.
Also I am using fetch to pull data from same source in page i.. under the app and it is working very fine. see its code as well.

import LargeCard from &quot;./components/LargeCard&quot;;
import MediumCard from &quot;./components/MediumCard&quot;;
import SmallCard from &quot;./components/SmallCard&quot;;
import Footer from &quot;./components/Footers&quot;;
import Header from &quot;./components/header&quot;;
export default async function Home() {
const res1 = await fetch(&quot;https://www.jsonkeeper.com/b/IJK5&quot;);
const res2 = await fetch(&quot;https://www.jsonkeeper.com/b/OJBH&quot;);
const data1 = await res1.json();
const data11 = data1;
const data2 = await res2.json();
const data22 = data2;
return (
&lt;&gt;
&lt;Header /&gt;
&lt;Banner /&gt;
{/* SmallCardSection */}
&lt;div className=&quot;  max-w-7xl mx-auto mt-5  pb-5  &quot;&gt;
&lt;h2 className=&quot; ml-5 text-2xl font-bold&quot;&gt;Explore Nearby&lt;/h2&gt;
&lt;div className=&quot; grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4  &quot;&gt;
{data11?.map((item) =&gt; (
&lt;SmallCard
key={item.key}
img={item.img}
location={item.location}
distance={item.distance}
/&gt;
))}
&lt;/div&gt;
&lt;/div&gt;
{/* MediumCardSection */}
&lt;section className=&quot;  max-w-7xl mx-auto mt-5   pb-5  &quot;&gt;
&lt;h2 className=&quot; text-2xl font-bold ml-5&quot;&gt;Live Anywhere&lt;/h2&gt;
&lt;div className=&quot;  relative flex flex-row space-x-3 overflow-scroll scrollbar-hide pl-5&quot;&gt;
{data22?.map((item) =&gt; (
&lt;MediumCard img={item.img} key={item.id} title={item.title} /&gt;
))}
&lt;/div&gt;
&lt;/section&gt;
&lt;div className=&quot;max-w-7xl mx-auto pl-5 pr-5 lg:pr-10 &quot;&gt;
&lt;LargeCard
title={&quot;The Greatest Outdoors&quot;}
description={&quot;Wishlists curated by Airbnb.&quot;}
buttonText={&quot;Get Inspired&quot;}
/&gt;
&lt;/div&gt;
&lt;div className=&quot; &quot;&gt;
&lt;Footer /&gt;
&lt;/div&gt;
&lt;/&gt;
);
}

I am making this project for study purpose so, not having that much knowledge

答案1

得分: 1

// next.config.js
module.exports = {
    async rewrites() {
        return [
          {
            source: '/api/:path*',
            destination: 'https://www.jsonkeeper.com/:path*',
          }
        ]
    }
};
英文:

Can you add destination key for your api domain?

// next.config.js
module.exports = {
async rewrites() {
return [
{
source: &#39;/api/:path*&#39;,
destination: &#39;https://www.jsonkeeper.com/:path*&#39;,
}
]
}
};

huangapple
  • 本文由 发表于 2023年6月26日 19:52:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76556427.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定