在我的React应用中,将代理服务器连接到我的Express服务器没有工作。
在我的React应用中,将代理服务器连接到我的Express服务器没有工作。
我在同一台本地机器上运行React应用程序的端口是3000,Express服务器的端口是4000。
在我的React应用程序中,我使用fetch API将我的注册表单数据发送到Express服务器的'/register'路由-
const response = await fetch('/register' , { method: 'POST', headers : { "Content-Type" : "application/json" }, body: JSON.stringify({ name: username, email : useremail, phone : userphone, work : userwork, password: userpassword, cpassword : usercpassword }) }); const data = await response.json(); if(data.status === 422 || !data){ window.alert("无效的注册"); console.log("无效的注册"); }else{ window.alert("注册成功"); console.log("注册成功"); //使用useHistory hook history.push('/login'); } }
而在我的Express服务器中,我在'/register'路由上进行了POST方法,并将表单数据存储在我的数据库中-
router.post('/register' , (req,res)=>{ const {name, email, phone, work, password, cpassword} = req.body; //我们检查输入是否为空 if(!name || !email || !phone || !work || !password || !cpassword){ return res.status(422).send('请填写所有字段'); } //通过检查电子邮件来观察用户是否已经注册 User.findOne({email : email}) .then((userExist) =>{ if(userExist){ return res.status(422).send('电子邮件已存在'); }else if(password !== cpassword){ return res.status(422).send('密码不匹配'); } //如果电子邮件不存在,那么用户是新用户,我们将其数据存储在数据库中 const user = new User({ name : name, email : email, phone : phone, work : work, password : password, cpassword : cpassword, }); //保存数据到数据库 user.save() .then(()=>{ res.status(201).send('用户注册成功') }) .catch((err)=>{ res.status(500).send(err); }) }).catch((err)=>{ console.log(err); }) })
在我的React应用程序的package.json文件中,我将代理添加到localhost:4000(Express服务器定义为端口4000)-
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"proxy" : "http://localhost:4000",
"dependencies": {
"@testing-library/jest-dom": "^5.11.10",
"@testing-library/react": "^11.2.6",
"@testing-library/user-event": "^12.8.3",
"bootstrap": "^5.0.0-beta3",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^5.2.0",
"react-scripts": "4.0.3",
"web-vitals": "^1.1.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
在我的Firefox控制台中,我遇到了以下错误-
在浏览器的网络选项卡下,我得到了这个-
我遇到了422状态错误。我已经尝试解决这个问题了5个小时了,但是阅读了很多解决方案和文章后,我无法解决这个问题。我还检查了stackoverflow上的类似问题,但是它们的解决方案没有起作用。基本上,我正在尝试将我的React应用程序的注册表单数据从React应用程序发送到Express服务器,通过在package.json文件(React应用程序)中定义代理,但是我不知道为什么React仍然认为它自己的端口是3000,而不是服务器端口4000。请帮助我解决这个问题。非常感谢。