Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0 using basic fetches a

Posted

技术标签:

【中文标题】Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0 using basic fetches and thunk【英文标题】: 【发布时间】:2021-09-04 23:21:07 【问题描述】:

我已将 thunk 正确导入并安装在我的 index.js 文件中。我正在尝试设置一个操作,该操作将在进行提取时呈现加载页面,然后在 .then() 块内进行第二次提取。这是因为每次获取都需要从 rails 显示页面检索数据,然后使用该代码创建 JS 对象并将其添加到数组中。代码如下...

return (dispatch) => 
        dispatch(type: 'LOAD_FIGURE')
        let movesLen = moves.length // Going to be either 2 or 3
        if (movesLen == 2)
            fetch(`http://localhost:3000/moves/show/$moves[0]`)   // Generate first move
                .then(resp => resp.json())  
                .then(json => console.log(json))    // make this functional later
                .then(fetch(`http://localhost:3000/moves/show/$moves[1]`)  // Generate the second move
                    .then(resp => resp.json())
                    .then(json => console.log(json)) // make this functional later
                )
        
    

这只会返回以下错误

Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

我不确定这里可能出了什么问题,因为此获取非常基本。我担心它与嵌套提取有关,但我两次收到错误的事实也让我认为,当它同时提取两者时,都返回相同的错误。

【问题讨论】:

我要检查的第一件事是 API 端点是否正确响应 - 在 devTools 中的网络选项卡中检查这一点。该错误通常表明正在接收和处理 html(或 XML),因此它会在响应的第一个位置找到 &lt; 与错误无关,但嵌套 .then() 调用是代码异味。 Promises aren't just callbacks。创建它们是为了避免嵌套它们。 你说的很对,但我需要这个项目在一周内正常运行,所以我需要专注于功能,然后继续修复任何代码异味 【参考方案1】:

您需要告诉服务器(可能是您的 Rails 应用程序)您需要 JSON 响应。 Rails 将默认为text/html,除非您另行指定或在您的路线中添加默认值。

这可以通过设置the Content-Type header来完成:

fetch(`http://localhost:3000/moves/show/$moves[0]`, 
  headers: 
    'Content-Type': 'application/json'
  
)

或者通过向 URL 添加扩展名:

fetch(`http://localhost:3000/moves/show/$moves[0].json`) ...

这会覆盖 Rails 中的标题。当然,您还必须确保您的 Rails 应用程序实际上也使用有效的 JSON 响应请求。

【讨论】:

以上是关于Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0 using basic fetches a的主要内容,如果未能解决你的问题,请参考以下文章

解决Uncaught (in promise) reason的问题

Uncaught (in Promise) DOMException: play() 只能由用户手势启动

解决Uncaught (in promise) reason的问题

Uncaught (in promise):消息端口在收到响应之前关闭

vue控制台报 Uncaught (in promise) TypeError:

Uncaught (in promise) TypeError: Cannot set properties of null (setting 'innerText') in OpenWetherMa