Next.js:FetchError: недопустимое тело ответа json Неожиданный токен <в JSON в позиции 0
Я пытаюсь использовать getStaticProps, чтобы просто сделать запрос, а затем передать эти данные из него в компонент:
Но я получаю такую ошибку:
FetchError: недопустимое тело ответа json на https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR Причина: неожиданный токен <в JSON в позиции 0
import AppliancePackage from '../components/AppliancePackage.jsx';
function HomePage({ data }) {
return (
<>
<AppliancePackage appliances={data} />
</>
);
}
export default HomePage;
// This function gets called at build time on server-side.
// It won't be called on client-side, so you can even do
// direct database queries. See the "Technical details" section.
export async function getStaticProps() {
// Call an external API endpoint to get data.
// You can use any data fetching library
var res = await fetch(
'https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR'
);
var json = await res.json();
data = JSON.stringify(json);
console.log('data ', data);
return {
props: {
data: json,
},
};
}
Я пытался использовать Stringify, но это не сработало! Также меня смущают комментарии:
Эта функция вызывается во время сборки на стороне сервера. Он не будет вызываться на стороне клиента, поэтому вы даже можете выполнять прямые запросы к базе данных. См. Раздел "Технические подробности".
И затем, как вы можете видеть, есть комментарий, в котором говорится:
Вызовите внешнюю конечную точку API, чтобы получать сообщения.
Но есть целый раздел о API маршрутов в их документации
Кто-нибудь может мне помочь, в чем дело?
Обновить
Алексей внес отличное понимание, но, как я сказал ему, я не могу найти в документации по аксиомам изменение пользовательского агента!
5 ответов
Алексей поставил меня на верный путь! Спасибо, мой друг!
Завелась надо сделать так:
export async function getStaticProps() {
// Call an external API endpoint to get posts.
// You can use any data fetching library
var res = await axios.get(
'https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR',
{
headers: {
Accept: 'application/json, text/plain, */*',
'User-Agent': '*',
},
}
);
var res = JSON.stringify(res.data);
console.log('res ', res);
// By returning { props: posts }, the Blog component
// will receive `posts` as a prop at build time
return {
props: {
data: res,
},
};
}
это добавление заголовков:
headers: {
Accept: 'application/json, text/plain, */*',
'User-Agent': '*',
},
А также *
для любого User-Agent
Я думаю, что конечная точка, о которой вы говорите, по какой-то причине чувствительна к "User-Agent".
Когда я попытался получить его с помощью CURL, как этот, он вернул некоторый ответ HTML (который, конечно, недействителен JSON)
curl https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR
Но таким образом он работал и возвращал JSON, как если бы он был доступен через браузер:
curl -H "User-Agent: some browser" https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR
TL; DR: попробуйте добавить в свой запрос заголовок "user-agent".
Для меня это было
.json()
вызывается для ошибок HTTP, возвращающих HTML в теле ответа
Вместо того, чтобы использовать
res.status(200).json(data)
в
api file
, использовать
res.status(200).json(JSON.stringify(data))
. Это устранит ошибку JSON в консоли. Это сработало для меня.
я думаю, что данные не были получены с конца, вот почему. я сталкиваюсь с теми же проблемами, я перезапустил свою систему и сеть, и она отлично работает обратно