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 使用node.js和express时重写URL参数,无需重定向_Javascript_Node.js_Express_Websocket - Fatal编程技术网

Javascript 使用node.js和express时重写URL参数,无需重定向

Javascript 使用node.js和express时重写URL参数,无需重定向,javascript,node.js,express,websocket,Javascript,Node.js,Express,Websocket,我使用node.js、express和sockets.io来: 了解用户到达(工作)时是否包含特定的URL参数 如果没有,则创建一个新的随机房间ID并将用户加入该房间(工作) 修改浏览器的地址栏以反映新的URL,而不重定向浏览器(如果可能,不确定或如何实现) 首先,我不知道在不违反DOM安全性的情况下这是否可行。如果是的话,我想知道我是如何做到的 如果不可能,和/或如果我需要使用重定向,您能告诉我如何在项目#1和#2的工作上下文中,在我已经工作的代码中执行重定向吗 我没有任何我试图完成的部分的示

我使用node.js、express和sockets.io来:

  • 了解用户到达(工作)时是否包含特定的URL参数
  • 如果没有,则创建一个新的随机房间ID并将用户加入该房间(工作)
  • 修改浏览器的地址栏以反映新的URL,而不重定向浏览器(如果可能,不确定或如何实现)
  • 首先,我不知道在不违反DOM安全性的情况下这是否可行。如果是的话,我想知道我是如何做到的

    如果不可能,和/或如果我需要使用重定向,您能告诉我如何在项目#1和#2的工作上下文中,在我已经工作的代码中执行重定向吗

    我没有任何我试图完成的部分的示例代码,因为我根本不知道应该从哪里开始。所以我很感激任何方向(重定向?双关语)


    谢谢大家!

    如果没有重定向,您无法仅从服务器更改浏览器URL栏中显示的内容。浏览器请求URL X,然后在URL栏中显示X。您可以从客户端Javascript更改URL栏中显示的内容。因此,您可以向页面添加一些JS,然后在页面加载时更改URL栏中显示的内容。这个问题似乎有点像XY问题,在XY问题中,您是在询问所选解决方案的问题,而不是描述原始问题并让我们为您提出可能的解决方案。@jfriend00:我不是本末倒置。如果我对这个问题的想法不正确,并且我的代码显示出这种错误的想法,我愿意更新。。。我认为答案在于重定向。。。但是我还没有找到一个好方法来完成我想做的事情。为什么要更改URL?房间状态可以存储在cookie中吗?如果您希望将其包含在URL中,那么为什么不直接加入文件室并重定向,让重定向的URL包含文件室,然后处理其余的请求?此外,您的
    joinRoom()
    函数将无法正常工作。您将为每个请求页面添加一个新的
    io.on('connection',…)
    处理程序。它们会堆积起来,很快你就会有成千上万的处理程序,它们会为每一个新的socket.io连接触发。你需要一个不同的设计。再说一次,我不确定你想实现什么,所以我不推荐你。我认为你建议从客户端更新地址栏中显示的内容是最好的方法。我必须研究一下“joinRoom()”函数是如何运行的。谢谢你指出那个问题!如果没有重定向,您无法仅从服务器更改浏览器URL栏中显示的内容。浏览器请求URL X,然后在URL栏中显示X。您可以从客户端Javascript更改URL栏中显示的内容。因此,您可以向页面添加一些JS,然后在页面加载时更改URL栏中显示的内容。这个问题似乎有点像XY问题,在XY问题中,您是在询问所选解决方案的问题,而不是描述原始问题并让我们为您提出可能的解决方案。@jfriend00:我不是本末倒置。如果我对这个问题的想法不正确,并且我的代码显示出这种错误的想法,我愿意更新。。。我认为答案在于重定向。。。但是我还没有找到一个好方法来完成我想做的事情。为什么要更改URL?房间状态可以存储在cookie中吗?如果您希望将其包含在URL中,那么为什么不直接加入文件室并重定向,让重定向的URL包含文件室,然后处理其余的请求?此外,您的
    joinRoom()
    函数将无法正常工作。您将为每个请求页面添加一个新的
    io.on('connection',…)
    处理程序。它们会堆积起来,很快你就会有成千上万的处理程序,它们会为每一个新的socket.io连接触发。你需要一个不同的设计。再说一次,我不确定你想实现什么,所以我不推荐你。我认为你建议从客户端更新地址栏中显示的内容是最好的方法。我必须研究一下“joinRoom()”函数是如何运行的。谢谢你指出那个问题!
    var express = require('express');
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    var url = require('url');
    
    app.use(express.static(__dirname + '/node_modules'));
    
    app.get('/', function(req, res, next) {
      res.sendFile(__dirname + '/index.html');
      var roomID = req.query.me;
        if (roomID == null || !io.sockets.adapter.rooms[roomID]) {
          console.log("URL room variable is: " + roomID);
          console.log('New room!');
          roomID = Math.random().toString(36).substring(2, 13);
          joinRoom(roomID);
          console.log("+ you just joined new room: " + roomID);
        } else {
          joinRoom(roomID);
          console.log("URL room variable is: " + roomID);
          console.log("= you just joined existing room: " + roomID);
        }
    });
    
    function joinRoom(roomID) {
      io.on('connection', function(socket) {
        socket.join(roomID);
        io.sockets.in(roomID).emit('connectToRoom', "Joined room: http://localhost:3030/?me=" + roomID);
      });
      return;
    }
    
    server.listen(3030);