Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 Socket.io一些emmits不';当别人触发时,不要触发_Javascript_Html_Node.js_Socket.io_Taffy - Fatal编程技术网

Javascript Socket.io一些emmits不';当别人触发时,不要触发

Javascript Socket.io一些emmits不';当别人触发时,不要触发,javascript,html,node.js,socket.io,taffy,Javascript,Html,Node.js,Socket.io,Taffy,我一直在尝试熟悉socket.io,所以在实时应用程序中使用它。我浏览了一个基本的示例,一个聊天室,然后我使用ngrok对多个客户端进行了测试,一切都很好。现在我想用TAFFY来保存一个对话日志,将它部署到一个连接到它的新用户,所以我添加了另一个emmit来发送该日志,而这个特殊的emmit似乎永远不会触发客户端的on语句 以下是服务器说明 io.on('connection', function(socket){ console.log("someone connected");

我一直在尝试熟悉socket.io,所以在实时应用程序中使用它。我浏览了一个基本的示例,一个聊天室,然后我使用ngrok对多个客户端进行了测试,一切都很好。现在我想用TAFFY来保存一个对话日志,将它部署到一个连接到它的新用户,所以我添加了另一个emmit来发送该日志,而这个特殊的emmit似乎永远不会触发客户端的on语句

以下是服务器说明

    io.on('connection', function(socket){
  console.log("someone connected");

        var chatLog={log:[]};
    log().each(function (iter){ //this is the taffy var
        chatLog.log.push({"usr":iter.usr,"msg":iter.msg});
    });
    var stringLog=JSON.stringify(chatLog);
    console.log(stringLog);
    socket.emit('cargaLog', stringLog);// THIS is the naughty emmit 

  socket.on('chat message', function(msg){
    var mensaje=JSON.parse(msg);
    log.insert({"usr":mensaje.usr,
                  "msg":mensaje.msg
              });
    io.emit('chat message', mensaje.usr.toUpperCase()+" dice: "+mensaje.msg);
  });
});
客户方

    $(function () {
      var socket = io();


      socket.on('cargaLog', function(log){
        alert(log); //this never happens
        console.log(log);
      });


      $('form').submit(function(){
        var mensaje=$('#m').val();
        var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
        socket.emit('chat message', json);
        $('#m').val('');
        return false;
      });


      socket.on('chat message', function(msg){

        var html='<li><img src="defaultUsrImg.png" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
        $('#messages').append(html);
        window.scrollTo(0, document.body.scrollHeight);
      });


      });
客户机html代码(仅适用于boddy,因为mt html包含,而且太长了)

  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script type="text/javascript" src="./socket.io/socket.io.js"></script>
    <script src="jquery-3.2.1.min.js"></script>
    <!-- <script src="/mensajes.js"></script>  THIS IS THE OLD CODE-->
    <script >
      var person = prompt("Introduce tu nombre o seudonimo", "anon"); //THIS IS THE WORKING CODE

      if(person === null || person===""){
        alert("Necesitas un nombre para participar");
      }
      else{
        $(function () {
          var socket = io();
          socket.emit('ia iege',person);
          socket.on('usrConectado',function(usr){
            var html='<li><h6>'+(usr)+' se ha conectado</h6></li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
          });
          $('form').submit(function(){
            var mensaje=$('#m').val();
            var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
            socket.emit('chat message', json);
            $('#m').val('');
            return false;
          });
          socket.on('chat message', function(msg){

            var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
          });
          socket.on('cargaLog', function(log){
            console.log(log);
            var oldLog=JSON.parse(log);
            cargaLog(oldLog);
          });
          });
        function cargaLog(newLog){
            //newLog is an object
            newLog.log.forEach(function(iter){
              var msg=iter.usr.toUpperCase()+' dijo: '+iter.msg;
                 var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
            });
        }
      }
    </script>
  </body>

    发送 var person=prompt(“inroduct tu nombre o seudonimo”,“anon”);//这是工作代码 如果(person==null | | person===“”){ 警惕(“参与方的名义必要性”); } 否则{ $(函数(){ var socket=io(); 插座发射('ia iege',人); socket.on('usrConectado',函数(usr){ var html='
  • '+(usr)+'se ha conectado
  • '; $('#messages').append(html); scrollTo(0,document.body.scrollHeight); }); $('form')。提交(函数(){ var mensaje=$('#m').val(); var json='{“usr”:“+person+”,“msg”:“+mensaje+”}”; emit('chat message',json); $('m').val(''); 返回false; }); socket.on('chat message',函数(msg){ var html='
  • '+(msg)+'
  • '; $('#messages').append(html); scrollTo(0,document.body.scrollHeight); }); socket.on('cargaLog',函数(log){ console.log(log); var oldLog=JSON.parse(log); cargaLog(oldLog); }); }); 函数cargaLog(newLog){ //newLog是一个对象 newLog.log.forEach(函数(iter){ var msg=iter.usr.toUpperCase()+“dijo:”+iter.msg; var html='
  • '+(msg)+'
  • '; $('#messages').append(html); scrollTo(0,document.body.scrollHeight); }); } }
    试试看


    我认为您可以尝试在
    服务器方面查看此存储库

    您可以为您的
    客户端尝试此选项

    注意:请记住关于
    socket.on(params,callback)
    ,它用于从emmiter获取数据,而
    io.emit(params,obj)
    服务器端的
    用于emmiting数据

    因此,您必须确保您向
    服务器
    客户端
    发送的消息以及从
    服务器
    客户端
    获取的消息(
    socket.on()
    )必须具有相同的
    参数

    您必须确保您的对象是
    var chatLog={log:[]};
    。如果您想获得
    log
    ,您必须这样做
    chatLog.log


    这对我来说很有用。我希望它能对你有所帮助。

    我将你的代码简化为最基本的代码,我得到的信息很好,你遇到了问题。以下是简化后的代码,效果很好:

    服务器代码:

    var express = require('express');
    var app = express();
    var http = require('http');
    var path = require('path');
    var port = process.env.PORT || 3000;
    var server= http.createServer(app).listen(port);
    
    var io = require('socket.io').listen(server);
    
    app.get('/', function(req, res){
        res.sendFile(__dirname + '/s1.html');
    
    });
    
    io.on('connection', function(socket) {
        console.log("someone connected");
    
        var chatLog = {log: [{usr: "someuser", msg: "somemsg"}]};
        var stringLog = JSON.stringify(chatLog);
        console.log(stringLog);
        socket.emit('cargaLog', stringLog); // THIS is the naughty emmit 
    });
    
    客户端代码:

    <html>
    <head>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>
    <script>
    function dbg(x) {
        let str = x;
        if (typeof x === "object") {
            str = JSON.stringify(x);
        }
        $("#log").append("<div>" + str + "</div>");
    }
    $(function() {
        var socket = io();
    
    
        socket.on('cargaLog', function(log) {
            dbg(log);
        });
    
    });
    </script>
    </head>
    <body>
    Empty Content, waiting for message to arrive.
    <div id="log"></div>
    </body>
    </html>
    
    
    函数dbg(x){
    设str=x;
    如果(x的类型==“对象”){
    str=JSON.stringify(x);
    }
    $(“#log”).append(“+str+”);
    }
    $(函数(){
    var socket=io();
    socket.on('cargaLog',函数(log){
    dbg(对数);
    });
    });
    空内容,等待消息到达。
    

    当我加载页面时,浏览器会立即显示您遇到问题的cargaLog消息。我建议您返回到像这样的超级简单的内容,直到您证明它有效,然后一次添加一个内容,直到您找到导致问题的原因。如果此代码不适用于您,那么您必须如果您的环境中出现了一些问题,我可能会重新安装各种组件(socket.io、node.js、express等)。

    我们需要一些帮助,了解您已经完成的疑难解答。您是否从:
    console.log(“有人连接”)收到服务器端控制台消息
    您是否看到此日志消息:
    console.log(stringLog);
    ?它们是您期望的吗?我想知道在
    socket.emit('cargaLog',stringLog)之前是否有什么东西;
    正在抛出异常,因此它永远不会到达该行代码。你应该问一个实际问题。是的@jfriend00日志显示了当有人连接时应该显示的内容,TAFFY var正在保存它必须显示的内容。此外,服务器运行良好,人们仍然可以通过Ngrok连接。我不明白为什么会这样ldn不起作用。如果猜测在“刚刚连接”的套接字上发送消息可能存在时间问题,您可以尝试在服务器上更改此选项:
    socket.emit('cargaLog',stringLog);
    改为:
    setTimeout(function(){socket.emit('cargaLog',stringLog)},500)作为一个实验。它没有改变任何事情,我甚至在ubuntu上尝试了它,以确保它不是windows 10的一些恶作剧,这是同样的问题。我要回到佩德尔的要求,看看我执行服务的方式是否有问题。谢谢你的帮助,我不认为这是
    。emit()
    OP正在询问。我想他们正在询问这个:
    socket.emit('cargaLog',stringLog)实际上,基本的聊天工具emits work fine是一个名为“cargaLog”的工具,它从来没有出现过。是的,因为这是一个基本的应用程序,我选择将每个参数作为字符串传递,这就是为什么我将聊天日志对象字符串化,在客户端我只需将其打印为任何其他字符串。如果一切正常,我只需将JSON sting解析回ob客户端的对象
    var json='{“usr”:“'+person+”,”
    
    var express = require('express');
    var app = express();
    var http = require('http');
    var path = require('path');
    var port = process.env.PORT || 3000;
    var server= http.createServer(app).listen(port);
    
    var io = require('socket.io').listen(server);
    
    app.get('/', function(req, res){
        res.sendFile(__dirname + '/s1.html');
    
    });
    
    io.on('connection', function(socket) {
        console.log("someone connected");
    
        var chatLog = {log: [{usr: "someuser", msg: "somemsg"}]};
        var stringLog = JSON.stringify(chatLog);
        console.log(stringLog);
        socket.emit('cargaLog', stringLog); // THIS is the naughty emmit 
    });
    
    <html>
    <head>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>
    <script>
    function dbg(x) {
        let str = x;
        if (typeof x === "object") {
            str = JSON.stringify(x);
        }
        $("#log").append("<div>" + str + "</div>");
    }
    $(function() {
        var socket = io();
    
    
        socket.on('cargaLog', function(log) {
            dbg(log);
        });
    
    });
    </script>
    </head>
    <body>
    Empty Content, waiting for message to arrive.
    <div id="log"></div>
    </body>
    </html>