Next.js:FetchError: invalid json response body Unexpected token < in JSON at position 0

Posted

技术标签:

【中文标题】Next.js:FetchError: invalid json response body Unexpected token < in JSON at position 0【英文标题】: 【发布时间】:2020-11-07 15:04:59 【问题描述】:

我正在尝试使用getStaticProps 来简单地发出请求,然后将该数据从它传递给组件:

但我收到此错误:

FetchError: 无效的 json 响应正文 https://www.ajmadison.com/product3.0/packages.index.json.php?sku=RF28R7351SR 原因:意外的令牌

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,
    ,
  ;

我尝试对其进行字符串化,但没有成功!我也有点被 cmets 搞糊涂了:

此函数在构建时在服务器端调用。 它不会在客户端被调用,所以你甚至可以这样做 直接数据库查询。请参阅“技术细节”部分。

然后如您所见,有一条评论指出:

调用外部 API 端点以获取帖子。

但在他们的docs 中有一个关于 API 路由的完整部分

谁能帮我看看怎么回事?

更新

Alexey 贡献了一些深刻的见解,但就像我对他说的那样,我在 axios 文档中找不到更改用户代理的方法!

【问题讨论】:

【参考方案1】:

我认为您所指的端点出于某种原因对“用户代理”敏感。

当我尝试像这样使用 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  

TLDR:尝试在您的请求中添加“user-agent”标头。

【讨论】:

谢谢,但我尝试查看 axios 文档以添加该内容,但找不到。你有什么想法吗? 你试过这样吗? github.com/axios/axios/issues/2560#issuecomment-555778304【参考方案2】:

Alexey 让我走上了正轨!谢谢我的朋友!

你必须这样做:

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*

【讨论】:

【参考方案3】:

不要在api file 中使用res.status(200).json(data),而是使用res.status(200).json(JSON.stringify(data))。这将消除控制台中的 JSON 错误。这对我有用。

【讨论】:

【参考方案4】:

对我来说,是 .json() 调用 HTTP 错误,在响应正文中返回 HTML

【讨论】:

【参考方案5】:

NextJS 上使用 Apollo Client 时出现同样的错误:

import  ApolloClient, InMemoryCache  from "@apollo/client";

const client = new ApolloClient(
  uri: "https://example.com/graphql",
  cache: new InMemoryCache(),
);

所以,我在 uri 中的 url 末尾添加了一个斜杠“/”

import  ApolloClient, InMemoryCache  from "@apollo/client";

const client = new ApolloClient(
  uri: "https://example.com/graphql/", // Here
  cache: new InMemoryCache(),
);

终于解决了这个错误。

【讨论】:

以上是关于Next.js:FetchError: invalid json response body Unexpected token < in JSON at position 0的主要内容,如果未能解决你的问题,请参考以下文章

homestead的laravel项目错误:Use of undefined constant JSON_INVALID_UTF8_SUBSTITUTE - assumed ‘JSON_INVAL(代

Mysql5.7.11 安装 cacti0.8.8f ,在导入cacti.sql数据库时出现下记错误,导致数据库导入终止: ERROR 1067 (42000) at line 1847: Inval

cd切换命令

MySQL 存储过程乘法

各种报错

6.case