嘿,
我现在正在做一个airbnb的克隆,我想通过npm run dev启动我的本地服务器,但是它给了我如下的错误。我不知道为什么今天早上一切都运行的很好,但是现在它不再运行了,即使我没有改变或者做任何事情。我在网上搜索,人们说响应可能是html而不是json,但是这怎么会突然发生呢?我还得到了一个部署的版本,你可以在这里访问https://airbnb-smoky-six.vercel.apphttps://airbnb-smoky-six.vercel.app这将是伟大的,如果有人能指导我通过修复它。
引用的文件包含以下代码:
import Head from 'next/head'
import Image from 'next/image'
import Header from '../Components/Header.js'
import Banner from '../Components/Banner.js'
import styles from '../styles/Home.module.css'
import SmallCard from '../Components/SmallCard.js'
import MediumCard from '../Components/MediumCard.js'
import LargeCard from '../Components/LargeCard.js'
import Footer from '../Components/Footer.js'
export default function Home({exploreData, cardsData}) {
return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<Header />
<Banner />
<main className='max-w-6xl mx-auto px-12 sm:px-16'>
<section className='pt-6'>
<h2 className='text-4xl font-semibold pb-5'>Explore Nearby</h2>
{/* Pull name from a server - API endpoints */}
<div className='grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 '>
{exploreData?.map(({img, distance, location}) => (
<SmallCard
key={img}
img={img}
distance={distance}
location={location}
/>
))}
</div>
</section>
<section>
<h2 className='text-4xl font-semibold py-8'>Live Anywhere</h2>
{/* pull data from API endpoints */}
<div className='flex space-x-3 overflow-scroll scrollbar-hide p-3 -ml-3'>
{cardsData?.map(({ img, title }) => (
<MediumCard
key={img}
img={img}
title={title}
/>
))}
</div>
</section>
<section>
<LargeCard
img="https://links.papareact.com/4cj"
title="The Greatest Outdoors"
description="Wishlist curated by Airbnb"
buttonText="Get Inspired"
/>
</section>
</main>
<Footer />
</div>
)
}
export async function getStaticProps() {
const exploreData = await fetch('https://links.papareact.com/pyp')
.then (
(res) => res.json()
);
const cardsData = await fetch('https://links.papareact.com/zp1')
.then (
(res) => res.json()
);
return{
props: {
exploreData,
cardsData,
},
};
}
2条答案
按热度按时间efzxgjgh1#
您突然收到错误,因为服务器没有响应JSON数据。这可能是服务器错误(500)或客户端错误数据(4xx)。无论是哪种原因,您的客户端都应该能够捕获错误。如果响应状态不正常(2xx HTTP状态代码),则您将抛出错误,而不是尝试解析JSON
这里有一个很好的示例文档
你的逻辑可以改写如下:
注意:根据您的应用程序业务来决定数据和错误处理流程。
o0lyfsai2#
当你调用
fetch()
时,它返回一个用Response类型解析的promise,这个response有一个包含一些文本的body。如果确定文本是JSON格式的,可以调用
res.json()
,它应该返回一个用正文中解析的值解析的承诺。但是,如果响应文本在JSON格式方面存在一些问题(或者根本不包含JSON),那么您就会遇到问题中提到的问题。
假设您尝试访问的API无法保证响应始终是JSON格式的字符串,则您应该自己处理SyntaxError:
你也应该考虑一下:发出请求并不总是成功的。2也许你没有连接到因特网。3也许你连接了,但是你的服务器发送了一个不成功的响应。4在这种情况下,你也应该处理不成功的情况。5一个简单的方法是检查响应对象:
您可以参考documentation on MDN以获得该属性和其他有用的属性。