NodeJS 快速路由 - 仅呈现第一个请求

Posted

技术标签:

【中文标题】NodeJS 快速路由 - 仅呈现第一个请求【英文标题】:NodeJS Express Routing - Only first request gets rendered 【发布时间】:2021-12-14 21:32:36 【问题描述】:

在服务器脚本中,我尝试提供不同的 html 文件。当 app.post('/login'...) 进来时, res.sendFile() 正在工作并且html被渲染。在第二次调用时,当 app.get('/go') 进入时,文件被提供,但不显示。我无法解释为什么不显示第二个 HTML 文件。我做错了什么?

第二个请求来自 javascript 中的 fetch 请求

socket.on('gameStarted', (data) => 
    console.log("Game started");
     fetch('/go', method: 'GET');
)

served but not displayed

app.post('/login', async (req, res, next) => 

    var roomNR = req.body.player.gameCode;
    var playerName = req.body.player.nickname;
    var codeValid = await checkCode(activeRoomsCollection, gameCodes, roomNR);
    var playerExists = await playerCollection.findOne( playerName: playerName )
    if (codeValid) 
      if ((playerExists === null) || !playerExists) 
        playerCollection.insertOne( room: roomNR, playerName: playerName, state: false );
        console.log(`Added player '$playerName' with roomnumber '$roomNR'`);
        res.sendFile(path.join(__dirname + '/../../public/lobby.html'), function (err) 
          if (err) 
            console.log(err);
            res.status(err.status).end();
          
          else 
            console.log('Sent Lobby');
          
        );
       else 
        // updateDomElement(player, elementId, data)
        //res.send('Benutzername existiert bereits');
      
     else 
      res.send('Code ungültig');
    



  );

  app.get('/go', (req, res, next ) => 
    res.sendFile(path.join(__dirname + '/../../public/raetsel1.html'), function (err) 
      if (err) 
        console.log(err);
        res.status(err.status).end();
      
      else 
        console.log('Sent Raetsel1');
      
    );
  );

【问题讨论】:

【参考方案1】:

fetch() 从不单独显示任何内容。这是您的 Javsascript 向远程服务器发出 http 请求的一种方式,这些服务器然后将内容返回给您的 Javascript。这些 http 请求的结果只会发送到您的 Javascript。页面视图中的任何内容都不会受到 fetch() 调用的影响。

如果您希望 fetch() 调用的结果在您的页面中显示某些内容,您需要编写 Javascript 来执行此操作(将内容插入当前页面)。

如果您只是想让浏览器转到一个新页面,那么请更改以下内容:

fetch('/go', method: 'GET');

到这里:

window.location = "/go";

这将导致浏览器转到 URL,检索内容并显示它。这将关闭当前页面并加载并显示一个新页面,浏览器 URL 栏中的 URL 将显示更新后的位置。

请注意,如果您在两个页面中都有 socket.io 代码,它将断开当前的 socket.io 连接,然后在新页面中运行 Javascript - 导致它创建一个新的 socket.io 连接(如果您有代码在新页面中执行此操作),因为当您在浏览器中加载和显示新网页时,socket.io 连接会发生这种情况。

【讨论】:

非常感谢,它有效! @Kuseng - 由于您可能是这里的新手,如果这回答了您的问题,那么您可以通过单击答案左侧的复选标记向社区表明这一点。这也将为您在 *** 上遵循正确的程序赢得一些声誉。

以上是关于NodeJS 快速路由 - 仅呈现第一个请求的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS express - 如何在路由器内添加会话数据?

在nodejs(Express)中使用CSURF的“无效的csrf令牌”。CSRF令牌适用于第一个请求,但对所有其他请求都给出错误

内部处理程序中的 Gorilla Mux 路由器仅工作一次,然后给出 404 页面未找到

带你入门nodejs第三天—express路由

带你入门nodejs第三天—express路由

Symfony路由配置教程已开课