React Node身份验证

问题描述 投票:0回答:2

我正在尝试使用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;
        }
    }
}   

javascript node.js reactjs express react-router
2个回答
0
投票

您使用try / catch的方式有误。当获取获取的响应状态为401(表示响应错误)时,它将失败并引发错误。尝试将重定向放入catch块中。希望对您有所帮助。


0
投票

我认为您每次都发送200条回复。

router.get('/getinfo', checkRedis, (req, res) => {
    res.send('works!');
})

只需省略匿名功能。您的.get只需要一个回调。

router.get('/getinfo', checkRedis)
© www.soinside.com 2019 - 2024. All rights reserved.