我正在尝试使用React Router完成身份验证。我在componentdidmount中调用一个端点,以查看用户是否已登录(如果尚未登录,则会收到401响应)。如果是这种情况,我会将其重定向到登录名,否则将其转到所需的组件。但是,这似乎不起作用。为此有任何特定的解决方法?
问题:1)如果用户未通过身份验证(我又收到401),则登录后仍将我带到/ profile。2)我在节点中遇到此错误-错误[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头-在该函数中。
App.js
class App extends React.Component {
constructor(props) {
super(props);
}
async componentDidMount() {
const url = '/getinfo'
try {
const res = await fetch(url, {
method: 'GET'
});
const json = await res.json()
const status = res.status
if(status === 401) {
this.props.history.push('/')
}
} catch(error) {
console.log('Error', error)
}
}
render() {
return (
<div>
<Router>
<NavigationBar />
<Switch>
<Route exact path = '/'
component = {LandingPage}
/>
<Route exact path = '/register'
component = {Register}
/>
<Route exact path = '/profile'
component = {Profile}
/>
<Route path="*" component = {() => "404 NOT FOUND"}/>
</Switch>
</Router>
</div>
);
}
}
export default withRouter(App);
后端功能-Nodejs
router.get('/getinfo', checkRedis, (req, res) => {
res.send('works!');
})
module.exports = {
checkRedis: function (req, res, next) {
console.log('called')
if(!req.session.user) {
res.sendStatus(401).json({message: 'Session expired'})
return;
}
}
}
您使用try / catch的方式有误。当获取获取的响应状态为401(表示响应错误)时,它将失败并引发错误。尝试将重定向放入catch块中。希望对您有所帮助。
我认为您每次都发送200条回复。
router.get('/getinfo', checkRedis, (req, res) => {
res.send('works!');
})
只需省略匿名功能。您的.get只需要一个回调。
router.get('/getinfo', checkRedis)