2017-09-05 72 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上首先消除变量。