Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express res.redirect()从前端fetch()请求调用时不重定向浏览器URL_Javascript_Node.js_Reactjs_Express_React Router - Fatal编程技术网

Javascript Express res.redirect()从前端fetch()请求调用时不重定向浏览器URL

Javascript Express res.redirect()从前端fetch()请求调用时不重定向浏览器URL,javascript,node.js,reactjs,express,react-router,Javascript,Node.js,Reactjs,Express,React Router,我似乎遇到了一个我还没有遇到的问题。我在后端有一个API路由,当调用该路由时,将通过res.redirect('/signin')(或者我认为是这样)将浏览器URL重定向到/signin。使用React路由器,此URL将触发“登录”组件的呈现。这实质上是处理JWT令牌的过期,并在用户的令牌过期时将用户发送回登录页面 主仪表板组件从后端接收用户登录时生成的JWT令牌。此JWT令牌用于前端访问受保护的API路由。JWT令牌存储在localStorage中,并具有过期时间。一旦令牌过期,它将显示为未定

我似乎遇到了一个我还没有遇到的问题。我在后端有一个API路由,当调用该路由时,将通过
res.redirect('/signin')
(或者我认为是这样)将浏览器URL重定向到
/signin
。使用React路由器,此URL将触发“登录”组件的呈现。这实质上是处理JWT令牌的过期,并在用户的令牌过期时将用户发送回登录页面

仪表板
组件从后端接收用户登录时生成的JWT令牌。此JWT令牌用于前端访问受保护的API路由。JWT令牌存储在
localStorage
中,并具有过期时间。一旦令牌过期,它将显示为未定义。当
仪表板
组件重新装载时,它总是在localStorage中进行检查,以确保其具有有效的JWT令牌,并且该令牌未定义

当JWT令牌过期并显示为
undefined
时,组件将调用后端路由,该路由处理将用户重定向回允许他们使用新生成的JWT令牌重新登录的URL

最后,这里是一些代码(为了简洁起见,已经对与此无关的代码进行了编辑)

对后端的前端调用
注销
路由:
我在componentDidUpdate()中进行此调用,因为每次更新我的Redux存储时,都会重新呈现组件,再次检查是否有有效的令牌,并且由于它不会在初始组件装载时触发,因此会给组件存储令牌的时间

这里是后端
注销路径:我尝试使用
res.redirect('/sign')
在这里无效。调用时,它不会更改URL。它不会抛出错误或任何东西。这似乎被忽视了。当我向它添加
console.log()
时,我可以看到前端
fetch()
肯定会调用它,并触发
console.log()
,所以我至少知道它是从前端调用的。邮递员也确认了路线是可以到达的

让我困惑的是,我的整个注册/登录系统在这些特定的路由中使用了
res.redirect()
,而且一切正常。我从未遇到过URL不变的问题

我应该这样重定向用户吗?我甚至可以使用这样的
fetch()
请求吗?正如我所提到的,我正在使用React路由器,所以我也想问一下,是否有一种方法可以使用它重定向浏览器URL,而不是在后端处理它


提前感谢您的阅读和任何见解

您需要在客户端而不是服务器端进行重定向。您可以使用React路由器中的内容,如
return在检查例如
this.state.redirect
之后,好的,我明天会研究这个问题。谢谢你的帮助!使用浏览器的Javascript调用
fetch()
XMLHttpRequest
只返回http响应,让Javascript处理它。它不会导致浏览器页面以任何方式发生更改。如果您想更改页面,您必须阅读该响应,然后在浏览器Javascript中自己更改页面。感谢您的响应。很有见地。
componentDidUpdate() {
const currentkey = localStorage.getItem('userToken');

    if(currentkey === 'undefined'){
       fetch('/account/logout', {
          method: 'GET'
       })
       .catch(err => {
          console.log(err)
       })
    }
 }
 app.get('/account/logout', (req, res) => {
     res.redirect('/signin');
     console.log('logout route called');
 });