Node.js Express路由问题:仅首次请求页面可正常渲染
问题原因与解决方案
你遇到的核心问题是:fetch 请求只是在后台获取了 HTML 内容,但并不会自动触发浏览器的页面导航或替换当前页面内容,这和登录时的场景完全不一样——登录请求应该是通过表单提交(非 AJAX 方式)发送的,浏览器会自动处理响应并加载新页面;而 fetch 属于异步 AJAX 请求,默认只会拿到数据,不会主动改变当前页面。
下面给你两种可行的解决方案:
方案一:直接使用页面导航(推荐)
如果你的需求只是跳转到 /go 对应的页面,完全不需要用 fetch,直接修改 window.location.href 即可,这是浏览器原生的页面跳转方式,会自动加载并显示目标页面:
socket.on('gameStarted', (data) => { console.log("Game started"); window.location.href = '/go'; // 直接跳转,替代fetch请求 });
方案二:通过fetch获取HTML后手动替换页面内容(仅特殊场景使用)
如果你确实需要先通过 fetch 做一些前置处理,再显示页面,可以在拿到HTML响应后,手动替换整个文档的内容:
socket.on('gameStarted', (data) => { console.log("Game started"); fetch('/go', {method: 'GET'}) .then(response => { if (!response.ok) throw new Error('请求失败'); return response.text(); // 将响应转为文本格式的HTML }) .then(html => { // 替换当前页面的全部内容 document.open(); document.write(html); document.close(); }) .catch(err => console.error('加载页面出错:', err)); });
不过这种方式需要注意:页面内的脚本、样式可能需要重新加载,稳定性不如直接导航,所以优先推荐方案一。
另外补充一下登录接口能正常显示的原因:你的 app.post('/login') 应该是通过表单的 submit 事件触发的(非AJAX请求),这种情况下浏览器会自动接收服务器返回的HTML,并替换当前页面,这是浏览器的默认行为,和 fetch 的异步请求逻辑完全不同。
内容的提问来源于stack exchange,提问作者Kuseng
相关产品推荐
相关产品推荐

