开发者问题收集

ReactJS 应用程序使用 nodejs/express 作为后端 - 无法让 api 工作到后端

2019-08-08
3939

我正在尝试实现一个需要访问数据库的 React 应用程序。据我所知,可以使用 nodejs/express 作为后端来完成此操作。此外,我认为通过向我的 react package.json 文件添加代理条目,我可以将 fetch 调用的“/api”请求重定向到后端服务器。但是,我认为它不起作用。在浏览器控制台中,localhost:3000(即 NPM react 服务器)上显示 404 错误。我的后端在端口 5000 上运行。

我可以访问后端服务器的“ http://localhost:5000/api ”,它会按设计返回 JSON。

这是我的 react package.json 文件:

{
  "name": "ubwo",
  "version": "0.1.0",
  "private": true,
  "proxy":"http://localhost:5000/api",
  "dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-redux": "^7.1.0",
    "react-router": "^5.0.1",
    "react-router-dom": "^5.0.1",
    "react-scripts": "3.0.1",
    "redux": "^4.0.1",
    "redux-thunk": "^2.3.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "resolutions": {
    "browserslist": "4.6.2",
    "caniuse-lite": "1.0.30000974"
  }
}

这是我的“测试”React 代码。我不太熟悉 fetch,所以也许代码需要一些更改?:

componentDidMount() {
    this.callApi()
        .then(res => this.setState({ response: res.express}))
        .catch(err => console.log(err));
}

callApi = async() => {
    const response = await fetch('/api/cust/all',{
        headers:{
            "accepts":"application/json"
        }
    });
    const customers = await response.json();
    if (response.status !== 200) throw Error(customers.message);

    return customers;
}
3个回答

当您在 fetch 调用中使用 /api/foo 时,它将针对您当前所在的 URL 执行请求。因此,您的 API 请求将扩展为

http://localhost:3000/api/foo

如您所述,您的 API 服务器正在 http://localhost:5000 上运行。因此,您在这里需要做的是提供 fetch 请求的完整路径。

fetch(`http://localhost:5000/api/foo`)

您可能会猜到,这会在生产过程中造成问题,因此典型的模式是使用可配置的环境变量:

fetch(`${process.env.API_URL}/api/foo`)

请参阅 create-react-app 环境变量文档

Ryan Castner
2019-08-08

您可能应该删除 package.json 文件中代理值末尾的 /api

希望这对您有帮助

Shmili Breuer
2019-08-08

您还可以检查主服务器文件中后端是否使用了 json 解析器,例如:

express.urlencoded([options])

const bodyParser = require('body-parser);
bodyParser.json([options])
Adam Falchetta
2020-10-27