2017-09-05 73 views
0

index.jsSocket.emit不是通過

var app = require('express')(); 
var path = require('path'); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
var users = []; 

connections = []; 

server.listen(process.env.PORT || 3000); 
app.use(require('express').static(path.join(__dirname))); 

console.log('server running'); 

app.get('/', function(req, res){ 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.on('connection', function (socket) { 
    var addedUser = false; 
    socket.on('new post', function(post){ 
     console.log(post); 
     socket.emit('posted', data); 
    }); 
}); 

client.js

$(function(){ 

    function submit(){ 
     socket.emit('new post', $("#text").val()); 
     console.log("submitted"); 
    } 

    function addPost(data){ 
     console.log(2); 
     var $post = $('<p></p>').text(data); 
     console.log($post); 
     $("#posts").append($post); 
    } 

    $("#submit").on("click", function(){ 
     submit(); 
    }); 

    socket.on('posted', function(data){ 
     console.log(1); 
     addPost(data); 
    }); 
}); 

的index.html

<html> 
    <head> 
     <title>title</title> 
     <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    </head> 

    <body> 
    <input type="text" id="text">Input</input> 
    <button id="submit">Submit</button> 


    <script src="client.js"></script> 

    <br> 
    <br> 
    <br> 

    <div id="posts"></div> 
    <script> 
     var socket = io(); 
    </script> 
    </body> 

</html> 

當我開始了服務器,t他控制檯日誌「服務器運行」罰款。我無法獲取提交帖子按鈕來執行任何操作。沒有任何調試控制檯消息出現,沒有任何反應。它應該被點擊提交按鈕時發出的「新崗位」,但它看起來好像什麼都沒有經過

+0

服務器上運行的是什麼版本的socket.io?你是否獲得服務器上的連接事件? client.js中的代碼被調用來設置? – jfriend00

+0

4.1.2,是的,我正在獲取連接事件。我在io.on('連接')之後放置了一個控制檯日誌並運行。對於你的第三個問題,你的意思是如果提交按鈕執行任何操作?如果是這樣,它確實如此。函數submit()在客戶端控制檯運行並記錄「提交」 –

+0

我不認爲4.1.2是一個socket.io版本,所以我不知道那是什麼。 socket.io 2.0最近剛剛發佈。我試圖弄清楚在客戶端和服務器上是否有匹配的socket.io版本,因爲這可能是消息不起作用的原因。如果您將''更改爲此'那麼它會從你的服務器加載一個匹配的socket.io客戶端版本,以防你的版本不匹配。 – jfriend00

回答

0

我能得到你的代碼,我自己的電腦上工作是這樣的:

index.js

var express = require('express'); 
var app = express(); 

var path = require('path'); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
var users = []; 

connections = []; 

app.get('/', function(req, res){ 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 

app.use(express.static(__dirname)); 

console.log('server running'); 


io.on('connection', function (socket) { 
    console.log("connection"); 
    socket.on('new post', function(post){ 
     console.log(post); 
     socket.emit('posted', post); 
    }); 
}); 

server.listen(process.env.PORT || 3000); 

client.js

$(function(){ 

    function submit(){ 
     socket.emit('new post', $("#text").val()); 
     console.log("submitted"); 
    } 

    function addPost(data){ 
     console.log(2); 
     var $post = $('<p></p>').text(data); 
     console.log($post); 
     $("#posts").append($post); 
    } 

    $("#submit").on("click", function(){ 
     submit(); 
    }); 

    socket.on('posted', function(data){ 
     console.log(1); 
     addPost(data); 
    }); 
}); 

的index.html

<html> 
    <head> 
     <title>title</title> 
     <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    </head> 

    <body> 
    <input type="text" id="text">Input</input> 
    <button id="submit">Submit</button> 


    <script src="/client.js"></script> 

    <br> 
    <br> 
    <br> 

    <div id="posts"></div> 
    <script> 
     var socket = io(); 
    </script> 
    </body> 

</html> 

更改index.js

  1. 定義express變量,以便它可以重複使用。
  2. app.use(express.static(...))之前定義app.get()因此我們一定要爲index.html提供app.get()而不是靜態位置。
  3. 變化res.sendfile()到res.sendFile()`
  4. 變化socket.emit("posted", data)socket.emit("posted", post)
  5. 移動server.listen()在所有其他設置完成後結束。
  6. express.static()刪除path.join(),因爲它不是必需的。
  7. path.join()res.sendFile()路徑建設中要求跨平臺安全。

其中,我確信唯一一個導致錯誤的是#4,其他人都很好管家。

更改client.js

更改的index.html

更改路徑client.js到/client.js


如果此代碼不能在Heroku上工作,那麼你要麼沒有定位在正確的目錄中的文件或Heroku的不正確配置,讓您的應用程序或socket.io正常工作。如果我是你,我首先會驗證這些代碼是否在你自己的本地計算機上工作,然後才能嘗試在heroku上首先消除變量。