1

I am working on a chat application using node.js, socket.io and express. I am using pm2 to run server.js . On the log it says:

0|server   | 18-08 12:14:47.128: Server listening on port 3000

There is no error in console neither. Please bear with me as I am still a newbie in node.js and socket.io. Every help will be highly appreciated. This is my code:

server.js

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var app = require('express')();
var https = require('https');
var fs = require('fs');
var ssl_server_key = '/data/web/chat/app/node/server_key.pem';
var ssl_server_crt = '/data/web/chat/app/node/server_crt.pem';
var server = https.createServer({
    key: fs.readFileSync(ssl_server_key),
    cert: fs.readFileSync(ssl_server_crt),
    NPNProtocols: ['http/2.0', 'spdy', 'http/1.1', 'http/1.0']
}, app);

var socket = require('socket.io');
var port    = process.env.PORT || 3000;
var io      = socket.listen(server);

server.listen(port, function () {
    console.log('Server listening on port %d', port);
});

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

    socket.on('new message', function(data){
       io.emit('push message', {msg: data.msg, sendername:data.sendername,     sender:data.sender, receiver: data.receiver,profilepic:data.profilepic,email:data.email,picData:data.picData})        ;
       console.log('new message from ', data.sendername);
     });

    socket.on('new announcement', function(data){
       io.emit('push announcement', {msg: data.msg, title:data.title1,     sendername:data.sendername, profilepic:data.profilepic});

     });
    socket.on('new email', function(data){
       io.emit('push email', {receiver: data.receiver, sender:data.sender,     email:data.email});

     });


    socket.on('disconnect',function(){
        console.log('disconnected');
    });
});

chatnew.js

$(function(){


    var socket = io.connect('https://nd.gcoin.link:3000');

    socket.heartbeatTimeout = 30000;

    console.log('check 1', socket.connected);
    socket.on('connect', function() {
      console.log('check 2', socket.connected);
    });

    socket.on('disconnect', function(){
        console.log('disconnected');
    });

    //var socket = io.connect();
    socket.on('connect', function() {console.log('connect event');});
    socket.on('connect_error', function(err) {console.log('connect     error',err);});

    socket.on('connect_timeout', function(err) {
        console.log("client connect_timeout: ", err);
    });



    socket.on('push message', function(response){
        var sender = $('#sender').val();
        var sender2 = $('#sender2').val();
        var receiver = $('#receiver').val();
        var receiver2 = $('#receiver2').val();
        var sendemail = $('#sendemail').val();
        var email = $('#youremail').val();
        var type = $('#type').val();

        getLastID();

        var last_id = $('#conv_id').val();
            last_id = parseInt(last_id) + 1;

        if(response.profilepic === 'n/a'){
            var pic = '/user_images/no_image.jpg';
        }else if(response.profilepic.substring(0, 4)=== 'https'){
            var pic =response.profilepic;
        }else if(response.profilepic === 'bot'){
            var pic = '/user_images/bot.png';
        }else{
            var pic ='/user_images/'+response.profilepic;
        }

        console.log(response.picData);
        console.log(response.picData.length);

        if(sender == response.sender && response.receiver == receiver2 ){
            updateLastView(response.sender,response.sender,type);
            if(response.picData.length > 6){
            //console.log(response.picData.length);
                $('.chat').append('<li class="self"><div class="float-right"><div class="flex"><label style="" class="self-msg">' +response.msg+'<img src= "/images/uploaded/'+response.picData+'"  class="msg-pic"  onclick="imgEnlarge(this)" /></label><img src="'+pic+'" class="img-profile" onclick="imgEnlarge(this)" ></div><time data-livestamp="'+moment().unix()+'" class="msg-rhs" style="color: #c1c1c1;" ></time></div></li>');

            }else{
                $('.chat').append('<li class="self"><div class="float-right"><div class="flex"><label style="" class="self-msg">' +response.msg+'</label><img src="'+pic+'" class="img-profile" onclick="imgEnlarge(this)" ></div><time data-livestamp="'+moment().unix()+'" class="msg-rhs" style="color: #c1c1c1;" ></time></div></li>');

            }


        }else if(sender == response.receiver && response.sender == receiver2 ){
            updateLastView(response.receiver,response.receiver,type);

            if(response.picData.length > 6){
                $('.chat').append('<li class="other"><div class="float-left"><div class="flex"><img src="'+pic+'" class="img-profile" onclick="imgEnlarge(this)" ><label style="" class="other-msg"> '+response.msg+'<img src= "/images/uploaded/'+response.picData+'" class="msg-pic" onclick="imgEnlarge(this)" /></label></div><time style="color: #c1c1c1;" data-livestamp="'+moment().unix()+'" class="msg-rhs" style="color: #c1c1c1;" ></time></div></li>');

            }else{
                $('.chat').append(' <li class="other"><div class="float-left"><div class="flex"><img src="'+pic+'" class="img-profile"  onclick="imgEnlarge(this)"><label style="" class="other-msg"> '+response.msg+'</label></div><time style="color: #c1c1c1;" data-livestamp="'+moment().unix()+'" class="msg-rhs" style="color: #c1c1c1;"  ></time></div></li>');  

            }


            socket.emit('new email', { receiver: sender, sender: receiver,email:email });

        }


        $("html, body").animate({ scrollTop: $(document).height() }, 1000);



    });




        $(document).on('keyup','.message-box',function(e){
            var message = $('.message-box').val();
            var $this = $(this);
            var len = $(this).val().length;

            //console.log('len:'+len);
            if(len == 0){
                document.getElementById("submit").disabled = false;
                     $("#submit").removeClass('disabled');
            }

            document.getElementById("submit").disabled = false;
             $("#submit").removeClass('disabled');
            // bot(message);

        });

        //image upload
        document.getElementById("file-upload").onchange = function() {
            //document.getElementById("formpic").submit();
            var message = '';
            var sender = $('#sender').val();
            var sendername = $('#sendername').val();
            var receiver = $('#receiver').val();
            var receiver2 = $('#receiver2').val();
            var type = $('#type').val();
            var profilepic = $('#profilepic').val();
            var email = $('#email').val();
            var pic = $("#file-upload").val();
            var pic = pic.replace(/^.*\\/, "");
            var picData = $("#image_data").val();
            var file_data = $('#file-upload').prop('files')[0]; 
            var hash = makehash();
            var filename = hash + '_'+ pic;
            var form_data = new FormData();                  
            form_data.append('file', file_data);
            form_data.append('hash', hash);
            form_data.append('message', message);
            form_data.append('sender', sender);
            form_data.append('receiver', receiver);
            form_data.append('type', type);

            console.log(type);
            console.log(receiver);
            console.log(sender);
            var server_name = $("#server_name").val();
                $('#loading-image').show();
                $.ajax({
                    url: '//'+server_name+'/base__upchat/', 
                    contentType: false,
                    processData: false,
                    data: form_data,                         
                    type: 'post',
                    success: function(x){
                        // alert(x); // display response from the PHP script, if any
                        if(x == 1){
                        socket.emit('new message', { msg: message, sender: sender,sendername:sendername, receiver:receiver2,picData:filename,profilepic:profilepic,email:email });
                        }
                        console.log('success:'+x);
                    },
                    complete: function(){
                        $('#loading-image').hide();

                    }
                 });

                $('#file-upload').val('');

                //updateLastView(sender,sender,type);
                //getLastID();
        };


        // make hash for image upload
        function makehash()
        {
            var text = "";
            var possible =         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

            for( var i=0; i < 5; i++ )
                text += possible.charAt(Math.floor(Math.random() * possible.length));

            return text;
        }

        // send message
        $('.btn-send').on('click',function(){
            var div = document.getElementById('submit');


            var message = $('.message-box').val();
            var sender = $('#sender').val();
            var sender2 = $('#sender2').val();
            var sendername = $('#sendername').val();
            var receiver = $('#receiver').val();
            var receiver2 = $('#receiver2').val();
            var type = $('#type').val();
            var profilepic = $('#profilepic').val();
            var email = $('#email').val();

            var pic = $("#file-upload").val();
            var pic = pic.replace(/^.*\\/, "");
            var picData = $("#image_data").val();
            var file_data = $('#file-upload').prop('files')[0]; 
            var hash = makehash();
            var filename = hash + '_'+ pic;


        if( message ==''){
            $('.validation').text('不正な文字が入力されました').fadeIn();
            $('#submit').prop('disabled','true').addClass('disabled');
            //$('.send').removeClass('btn-send');
        }else {

            validateWords();
            var check = checkWords(message);

        if (check == true){
            //alert('bad');
            $("#characters").text('不正な文字が入力されました').css('color','red');
            //alert('不正な文字が入力されました');
            $('#submit').prop('disabled','true').addClass('disabled');


        }else{
            document.getElementById("submit").disabled = false;
             $("#submit").removeClass('disabled');
            //console.log('message:'+validateEmail(message));
            if(validateEmail(message) == true ){
                //console.log('message:'+validateEmail(message));
                $("#characters").text('不正な文字が入力されました').css('color','red');
                //alert('不正な文字が入力されました');

                $('#submit').prop('disabled','true').addClass('disabled');

            }else{
                document.getElementById("submit").disabled = false;
                 $("#submit").removeClass('disabled');
                if(phonenumber(message) == true ){
                    $("#characters").text('不正な文字が入力されました').css('color','red');
                    //alert('不正な文字が入力されました');
                    $('#submit').prop('disabled','true').addClass('disabled');

                }else{

                    document.getElementById("submit").disabled = false;
                    $("#submit").removeClass('disabled');


                    $('.message-box').val('');

                    var botdb ='0';
                    updateDB(receiver,sender,message,type,email,botdb); //Update message in DB
                    $('#characters').text('130/130').css('color','#333');
                    socket.emit('new message', { msg: message, sender: sender,sendername:sendername, receiver:receiver2,picData:filename,profilepic:profilepic,email:email });
                    $('.validation').css({"display":"none"});
                    bot(message,receiver,sender,type,email,sendername,receiver2,filename,profilepic,sender2);
                    /* var bot_reply = $("#bot_reply").val();
                     alert(bot2(message));
                    console.log('bot_reply:'+bot_reply);*/
                    //bot(message);
                    /*var bot_reply2 = $("#bot_reply").val();
                    alert(bot_reply2);*/






                }
            }

        }
        }


});


// validating input for email entry
function validateEmail(elementValue)
{   
  // var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
    var emailPattern = /[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}/igm;
    var patt = new RegExp(emailPattern);
   return patt.test(elementValue);   
}  

// validating input for phone number entry
function phonenumber(inputtxt) {

    //var numberPattern = /^\(?([0-9]{3})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/
    var numberPattern = /\(?([0-9]{3})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})/igm;;
    var patt = new RegExp(numberPattern);
   return patt.test(inputtxt);

}


// validating input for bad words entry
 function checkWords(message) {
        var my_textarea = $('.message-box').val().toLowerCase();
        var pattern1 = $('#bad').val();


        var patt = pattern1.split("|");

        if(hasWhiteSpace(my_textarea) == true ){
            var res = my_textarea.split(" ");
            for (i = 0; i < res.length; i++) { 

                for (i2 = 0; i2 < patt.length; i2++) {
                    switch(res[i]){
                    case 'anal':
                    case patt[i2]:
                        return true;
                        break;

                    }
                }

            }

        }else{
            for (i2 = 0; i2 < patt.length; i2++) {
                switch(my_textarea){
                case 'anal':
                case patt[i2]:
                    return true;
                    break;

                }
            }

        }


 }

function hasWhiteSpace(s) {
    return s.indexOf(' ') >= 0;
}



 //inserting message to db
 function updateDB(receiver,name,msg,type,email,botdb){
     console.log('receiver:' + receiver);
     console.log('name:' + name);
     console.log('msg:' + msg);
     console.log('type:' + type);
     console.log('email:' + email);
     console.log('botdb:' + botdb);
        $.post('/base__process/',{method:'update',receiver:receiver,sender:name,msg:msg,type:type,email:email,botdb:botdb},function(response){
            // alert(response);
            var pic1 = JSON.parse(response);
            //$('.uspoints').text(number_format(pic1.pt,'.','.',',')+' PTS.');
            console.log('response:' + response);
        });
 }

 function bot(msg,receiver,sender,type,email,sendername,receiver2,filename,profilepic,sender2){

     var type ='0';
     var botdb ='1';
     $.post('/base__process/',{method:'bot_reply',msg:msg},function(reps){

         console.log('bot:'+reps);
            var dt = JSON.parse(reps);
            console.log('msg: '+msg);
             console.log('botrep:'+dt.reply);
             console.log('botmsg:'+dt.msg);
            if(dt.msg == msg){
                 $("#bot_reply").val(dt.reply);
                /* var rep = dt.rep;
                 return rep;*/
                // alert( $("#bot_reply").val());
                 var bot_reply = $("#bot_reply").val();
                 if(bot_reply != 'n/a'){

                        updateDB(sender2,receiver2,bot_reply,type,email,botdb); //Update message in DB
                        $('#characters').text('130/130').css('color','#333');
                        socket.emit('new message', { msg: bot_reply, sender: receiver2,sendername:sendername, receiver:sender,picData:filename,profilepic:'bot',email:email });
                        $('.validation').css({"display":"none"});
                    }

             }else{
                 $("#bot_reply").val('n/a');
                /*var rep = 'n/a';
                 return rep;*/
                // alert( $("#bot_reply").val());
             }


    });


 }


 function number_format (number, decimals, dec_point, thousands_sep) {
        // Strip all characters but numerical ones.
        number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
        var n = !isFinite(+number) ? 0 : +number,
            prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
            sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
            dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
            s = '',
            toFixedFix = function (n, prec) {
                var k = Math.pow(10, prec);
                return '' + Math.round(n * k) / k;
            };
        // Fix for IE parseFloat(0.55).toFixed(0) = 0;
        s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
        if (s[0].length > 3) {
            s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
        }
        if ((s[1] || '').length < prec) {
            s[1] = s[1] || '';
            s[1] += new Array(prec - s[1].length + 1).join('0');
        }
        return s.join(dec);
    }

 // fetching bad words
 function validateWords()
 {   

    $.post('/base__process/',{method:'validateWords'},function(reps){
                  $("#bad").val(reps);
                 // console.log(reps);
            });

 }  

 // updating message last view
 function updateLastView(sender,receiver,type){

        $.post('/base__process/',{method:'updateLastView',sender:sender,receiver:receiver,type:type},function(response){

            var pic1 = JSON.parse(response);
        });
  }


//getting last insert id in message
function getLastID(){

    $.post('/base__process/',{method:'getLastID'},function(response){           
        var pic1 = JSON.parse(response);
        console.log('last:'+pic1.conv_id);
          $('#conv_id').attr('value', pic1.conv_id);
    });

}




});

$(function() {

//Pretty Photo
$("a[rel^='prettyPhoto']").prettyPhoto({
    social_tools: false
}); 

$('#input').keypress(function(event) {
    if (event.keyCode == 13) {
        event.preventDefault();
    }
});

$('#input').keyup(updateCount);
$('#input').keydown(updateCount);

function updateCount() {
    var cs = $(this).val().length;
    var cs2 = 130 - cs;
    var cs3 =  130 - cs+'/130';
    if(cs2 <= 5){
      $('#characters').text(cs3).css('color','red');
    }else{
      $('#characters').text(cs3).css('color','#333');
    }

}

function maxLength(el) {    
    if (!('maxLength' in el)) {
        var max = el.attributes.maxLength.value;
        el.onkeypress = function () {
            if (this.value.length >= max) return false;
        };
    }
}

maxLength(document.getElementById("input"));





});

Edit1: tried the following but no luck

Socket.io not starting

Node.js Socket.IO not working completely

Edit 2: this error show :

connect error Error: xhr poll error
Stack trace:
[14]</n.prototype.onError@https://gcoin.link/js/socket.io.js:719:25
[17]</</o.prototype.doPoll/<@https://gcoin.link/js/socket.io.js:885:25
[9]</n.prototype.emit@https://gcoin.link/js/socket.io.js:419:63
[17]</</i.prototype.onError@https://gcoin.link/js/socket.io.js:921:21
[17]        </</i.prototype.create/e.onreadystatechange/<@https://gcoin.link/js/socket.io.js:907:33

after adding this :

socket.on('connect_error', function(err) {console.log('connect error',err);});

tried these:

How configure reconnecting in socket.io?

Controlling the heartbeat timeout from the client in socket.io

but error : connect error Error: xhr poll error still shows

These scripts are loaded to ch002.html

<script src="/js/chatnew.js" ></script>
<script src="/js/socket.io.js"></script>
Yilmaz
  • 35,338
  • 10
  • 157
  • 202
justMe
  • 63
  • 11
  • What errors do you see in the client or server console? What do you see if you listen for the `connect_error`, `connect_timeout` and `connect` events in the client? – jfriend00 Aug 18 '17 at 06:42
  • i don't know how to do that . can you show/link me how ? this is the message i see on the server log " 0|server | 18-08 12:14:47.128: Server listening on port 3000" . this shows when i listen to server. i don't see any error message in the console – justMe Aug 18 '17 at 07:27
  • ANYTIME things are not working properly, one of the first things you should do it to make sure you're listening for all possible errors. In the client, you can register additional event handlers such as `socket.on('connect', function() {console.log('connect event'});` and `socket.on('connect_error', function() {console.log('connect error'});` and so on. It works exactly the same way you are using `io.on('connection', ...)` in the server except you register for events on the client `socket` object when doing it in the client. – jfriend00 Aug 18 '17 at 07:29
  • i've added that after the server.listen but i only got this on the log : 0|server | 18-08 16:31:41.269: Server listening on port 3000 – justMe Aug 18 '17 at 07:33
  • you edited your comment. i tried the edited one then i got this error : 18-08 16:36:48.769: TypeError: socket.on is not a function – justMe Aug 18 '17 at 07:38
  • You must not be putting the code in the right place. It needs to go right after the line where `var socket = ....` is in the client code. – jfriend00 Aug 18 '17 at 07:40
  • Examples of client-side `socket.on()` here: https://github.com/socketio/socket.io/blob/master/examples/chat/public/main.js#L229 – jfriend00 Aug 18 '17 at 07:42
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/152222/discussion-between-justme-and-jfriend00). – justMe Aug 18 '17 at 07:44
  • oh yeah i've put it on the wrong place. my mistake . i put it in the server.js instead on the client. now i have this in my console :connect error chatnew.js:10:41 do you have an idea what might be wrong ? and thank you for your patience with me . – justMe Aug 18 '17 at 09:15
  • All the `socket.on()` code on your server except for the`socket.on('new user', ...)` is put in the wrong place. All the other ones need to go with that one. I think this would cause an error when starting your server. – jfriend00 Aug 18 '17 at 16:25
  • i've removed every socket.on() on my server code . i left this : io.on('connection', function (socket) { console.log('io connected');}); but i only have this on my server log : 0|server | 22-08 15:02:39.485: Server listening on port 3000 . and this on console : connect error . – justMe Aug 22 '17 at 06:06
  • I'd suggest you read this [socket.io not connecting](https://stackoverflow.com/questions/45807517/socket-io-not-sending-to-client/45808034) and see if your problem is the same. – jfriend00 Aug 22 '17 at 06:08
  • tried it but it gives me this error : connect error Error: xhr poll error Stack trace: [14] – justMe Aug 22 '17 at 07:03
  • on my client side i have this link : then change it to but shows this error : ReferenceError: io is not defined – justMe Aug 22 '17 at 07:03
  • tried this from https://stackoverflow.com/questions/11632969/how-configure-reconnecting-in-socket-io/26331082#26331082 : var socket = io.connect('https://nd.gcoin.link:3000', { 'reconnection': true, 'reconnectionDelay': 1000, 'reconnectionDelayMax' : 5000, 'reconnectionAttempts': 5 }); but same error shows : – justMe Aug 22 '17 at 07:05
  • `io.connect()` expects an actual URL such as `http://nd.gcoin.link:3000` or `https://nd.gcoin.link:3000`. And, where is `chatnew.js` being loaded from? 4 days with no feedback here - what's with that? If you're not going to stay regularly engaged, then I don't know why I would. – jfriend00 Aug 22 '17 at 07:11
  • Also, you're perhaps in an https page. You may not be able to connect to http services from an https page. – jfriend00 Aug 22 '17 at 07:13
  • i wrote https: //nd.gcoin.link:3000. don't know why it turned just nd.gcoin.link:3000 . chatnew.js is from my js folder. it contains all my codes for node. i'm loading it to my chat.html . sorry for not updating for 4 days. we don't have work on weekends and yesterday was a holiday. i forgot my password for this site that's why i can't open it on weekends . i'm using the pc here at work and passwords was saved here – justMe Aug 22 '17 at 07:24
  • yes i'm in an https page . i'm using this to connect to https : var https = require('https'); var fs = require('fs'); var ssl_server_key = '/data/web/chat/app/node/server_key.pem'; var ssl_server_crt = '/data/web/chat/app/node/server_crt.pem'; //var server = require('http').createServer(app); var server = https.createServer({ key: fs.readFileSync(ssl_server_key), cert: fs.readFileSync(ssl_server_crt), NPNProtocols: ['http/2.0', 'spdy', 'http/1.1', 'http/1.0'] }, app); – justMe Aug 22 '17 at 07:25
  • I need to see your entire server code and your entire web page where you're trying to connect. Too time consuming to continually guess what might be wrong. – jfriend00 Aug 22 '17 at 07:43
  • sure . i can let you see my codes . is it ok if we move this discussion to chat ? – justMe Aug 22 '17 at 07:46
  • I do not intend to be in chat. If you can't share your code here, then this is not the right place to solve your problem. This is not a private support network. It's a question and answer site where the goal is to answer your question in public AND to leave a reference here that others could learn from so that the question doesn't have to be asked and answered again. I'm also not going to be awake a lot longer tonight. – jfriend00 Aug 22 '17 at 07:48
  • ok. i'll just edit my question and post all the codes – justMe Aug 22 '17 at 07:51
  • i've edited my question and posted all the codes from server and client js – justMe Aug 22 '17 at 08:15
  • My guess would be that you have the wrong version of socket.io in the client. Try changing this `` to this `` which will let socket.io automatically serve the client version that matches what you have on the server. Also, in the web page, you should load socket.io before you load chatnew.js. – jfriend00 Aug 22 '17 at 19:56
  • tried changing this to this but got this error : ReferenceError: io is not defined . i also loaded socket.io before chatnew.js – justMe Aug 23 '17 at 01:58
  • You need to carefully compare versions of socket.io on client and server. Please report exactly which versions you are running for both. If `/socket.io/socket.io.js` does not work for the ` – jfriend00 Aug 23 '17 at 02:00
  • socket.io@1.4.8 socket.io-client@1.4.8 both have the same version . i checked it through the terminal via npm list socket.io and npm list socket.io-client – justMe Aug 23 '17 at 02:06
  • How do you know what version `/js/socket.io.js` is? You don't show any server code that would serve that file so I have no idea where that actually comes from. – jfriend00 Aug 23 '17 at 02:11
  • i don't have a way to check what version is /js/socket.io.js . it's not indicated in the file. i copied it from a tutorial . i will find the tutorial for a moment then i'll get back to you. i already tried this before on a different project and it's working fine but the difference is that this one is served on https while the other one is in http – justMe Aug 23 '17 at 02:22
  • "Copied from a tutorial" and no idea what version it is will be a problem. You MUST know exactly what version it is and that it's the correct version. That's what your client is trying to use. It must be the same version as the server. As I said 6 hours ago, I'd still wager a guess that you have a version mismatch. If your socket.io server is configured correctly, then it will automatically serve the correct client version at the URL `/socket.io/socket.io.js`. – jfriend00 Aug 23 '17 at 02:28
  • the version on /js/socket.io.js was 1.3.7 . found a cdn with version 1.4.8 and copied to /js/socket.io.js . then this error shows: Error: xhr poll error – justMe Aug 23 '17 at 03:13

0 Answers0