Debugging React/Flask connection with SyntaxError: Unexpected token < in JSON at position 0

Debugging React/Flask connection with SyntaxError: Unexpected token < in JSON at position 0

我正在关注 https://blog.miguelgrinberg.com/post/how-to-create-a-react--flask-project 在使用 npx create-react-app 并添加单个烧瓶文件后尝试将简单的 Flask 后端与 ReactJS 连接。

package.json

我在 "proxy": "http://localhost:5000" 上设置了一个代理,使用新的脚本命令 yarn start-backend

  "scripts": {
    "start": "react-scripts start",
    "start-backend": "cd app && python3 app.py",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

nav.js

我已经使用 MaterialUI 设置了一个 Button,它调用一个函数来记录 JSON 响应。

class Nav extends React.Component {

    clicked() {
        fetch('/').then(res => {
            console.log(res.json());
        }).then(data => {
            console.log(data);
        })
    }

    render() {
        return (
            <Box sx={{ flexGrow: 1}}>
                <AppBar position="static">
                    <Toolbar>
                        <SignUpForm onClick={() => this.clicked()} />
                    </Toolbar>
                </AppBar>
            </Box>
        )
    }
}

在顶级目录中,我创建了一个名为 app 的目录,其中包含一个包含以下代码的 app.py 文件。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return {"msg": "homepage from the backend."}

if __name__ == "__main__":
    app.run(port=5000, debug=True)

当我使用 yarn startyarn start-backend 并单击按钮时,出现以下错误

Promise {<pending>}
nav.js:14 undefined
VM1769:1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

正在尝试调试,但不幸的是,我一无所获。有相关问题,但似乎没有任何效果。我尝试使用 http://localhost:5000/.

将烧瓶文件移动到顶级目录 public
fetch('/', {
     headers : { 
          'Content-Type': 'application/json',
          'Accept': 'application/json'
         }
}).then(res => {
            console.log(res.json());
        }).then(data => {
            console.log(data);
        })

好的,作为 JavaScript/ReactJS 的新手,我似乎遗漏了两件事

  1. 我没有 return Promise 这看起来很奇怪,因为我认为你不必 return 东西

  1. 将路径从 / 更改为 /api/test 似乎可行。

我必须进一步挖掘才能理解,但现在它解决了我的问题。

这是更改后的代码

    clicked() {
        fetch('/api/test')
            .then(res => {return res.json()} )
            .then(
                data => {
                    console.log(data)
            })
    }


@app.route("/api/test")
def home():
    return {"msg": "homepage from the backend."}