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`)
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