You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:32:46