node.js - Express 服务器与 React App 通信
问题描述
我在验证登录后尝试重定向到我的 React 应用程序。但它不起作用,不知道为什么。
React App 在端口3000
服务器在3001端口
我在登录提交时路由到服务器-> 服务器使用护照进行身份验证-> 它应该重定向到 React App 路由'/secured'。相反,它显示GET http://localhost:3001/secured 404 (Not Found)
它正在路由到服务器地址。如何解决这个问题?
身份验证工作正常。我已经使用邮递员检查了所有内容。
快递服务器
//middleware
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(cors({
origin: 'http://localhost:3000', //location of frontend app (react app here)
credentials: true,
}))
app.use(expressSession({
secret: 'secret',
resave: true,
saveUninitialized: true,
}))
app.use(cookieParser('secret'))
app.use(passport.initialize())
app.use(passport.session())
require('./models/passport-config')(passport)
// routes
app.get('/', (req, res) => {
res.send('Home route')
})
app.post('/login', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) { return next(err) }
if (!user) { return res.redirect('/') }
req.logIn(user, (err) => {
if (err) { return next(err) }
return res.redirect('/secured')
})
})(req, res, next)
})
app.post('/register', (req, res) => {
console.log(req.body)
})
app.get('/user', (req, res) => {
res.send(req.user)
})
// server init
app.listen(3001, () => {
console.log('serving at http://localhost:3001...')
})
“反应应用程序 - App.js
import './App.css';
import Register from './components/Register';
import Login from './components/Login';
import {BrowserRouter, Route} from 'react-router-dom'
function App() {
return (
<div className="App">
<BrowserRouter>
<div>
<Route exact path="/" component={Login} />
<Route path="/secured" component={Register} />
</div>
</BrowserRouter>
</div>
);
}
export default App;
REACT 应用程序 - Login.js
import React, { Component } from 'react'
import "./login.css"
import axios from 'axios'
class Login extends Component {
constructor(props) {
super(props)
this.state = {
username: null,
password: null,
}
}
handleChange = (event) => {
event.preventDefault()
this.setState({
...this.state,
[event.target.name]: event.target.value,
})
}
handleSubmit = (event) => {
event.preventDefault()
axios({
method: "post",
data: this.state,
withCredentials: true,
url: 'http://localhost:3001/login'
})
// .then(this.getData())
}
getData = () => {
axios({
method: "get",
data: this.state,
withCredentials: true,
url: 'http://localhost:3001/user'
}).then(res => {
this.setState({
username: res.data['0'].username,
email: res.data['0'].email,
password: null
});
})
}
render() {
return (
<div >
<div>
<form id='login' onSubmit={this.handleSubmit}>
<div>
<h3>Login</h3>
</div>
<div >
<div >
<input onChange={this.handleChange} id="icon_prefix" type="text" name='username' />
<label htmlFor="icon_prefix">Username</label>
</div>
</div>
<div>
<div >
<input onChange={this.handleChange} id="icon_prefix" type="password" name='password' />
<label htmlFor="icon_prefix2">Password</label>
</div>
</div>
<div >
<div >
<input type='submit' />
</div>
</div>
</form>
<div>
Already a member? <a href="/secured">Register here</a>
</div>
</div>
</div>
)
}
}
export default Login
解决方案
在组件的handleSubmit
函数中<Login />
,您应该添加.then()
回调,检查错误/成功的响应,然后在 UI 中向用户显示错误或使用React Router History topush
或replace
当前路由。
另一种选择可能是在您的<Login />
组件中存储一个状态变量,this.state.isAuthenticated
然后您可以检查您的render()
方法并选择返回一个React Router Redirect,例如:
render() {
if (this.state.isAuthenticated) {
return <Redirect to="/somewhere/else" />
}
return (
<div>
...
</div>
)
}
推荐阅读
- node.js - API 请求成功,但 axios 失败
- php - 获取 Laravel 中的所有关系多对多多态
- vba - 如何让多个用户使用 MS Access 前端和 MariaDB 从同一个表中选择不同的记录?
- swift - JSONSerialize 在不同的 json 对象上
- flutter - 找不到 MediaQuery 祖先?
- stripe-payments - 是否有必要创建所有帐户,人员,客户才能进行条带式交易?
- c++ - 架构 x86_64 的未定义符号:链接器错误
- iis - iis url 重写有或没有查询
- node.js - POST 在 ProxyPass 之后变为 GET
- android - Ionic Capacitor firebase 推送通知,错误:此过程中未初始化默认 FirebaseApp