【问题标题】:Socket.io not responding, Node.jsSocket.io 没有响应,Node.js
【发布时间】:2014-09-03 23:52:26
【问题描述】:

我正在将我的代码移动到服务器。此代码可以在我在 localhost 上设置的我自己的服务器上完美运行并呈现数据库信息,但是当我从我的服务器运行代码时,会显示来自 index.html 的错误,指出“io is not defined”。无论出于何种原因,socket.io 都没有被识别。此外,如果我在浏览器中输入 localhost:3000,则不会显示任何内容。任何帮助将不胜感激。

我有两个文件,server.js 和 index.html。

server.js:

    var mysql = require('mysql')
    var io = require('socket.io').listen(3000)
    var db = mysql.createConnection({
    host: '127.0.0.1', // Important to connect to localhost after connecting via ssh in screen
    user: 'username',
    password: '12345',
    database: '12345',
    port: 3306
})


// Log any errors connected to the db
db.connect(function(err){
    if (err) console.log(err)
})


// Define/initialize our global vars
var notes = []
var isInitNotes = false
var socketCount = 0



//Socket.io code below

io.sockets.on('connection', function(socket){
    // Socket has connected, increase socket count
    socketCount++
    // Let all sockets know how many are connected

    io.sockets.emit('users connected', socketCount)

    socket.on('disconnect', function() {
        // Decrease the socket count on a disconnect, emit
        socketCount--
        io.sockets.emit('users connected', socketCount)
    })
    socket.on('new note', function(data){

        // New note added, push to all sockets and insert into db
        notes.push(data)
        io.sockets.emit('new note', data)
        // Use node's db injection format to filter incoming data
        db.query('INSERT INTO notes (note) VALUES (?)', data.note)
    })
 console.log("10");

    // Check to see if initial query/notes are set
    if (! isInitNotes) {
        // Initial app start, run db query
        db.query('SELECT * FROM `Users`')
            .on('result', function(data){
                // Push results onto the notes array
                //console.log(notes);
                notes.push(data)
            })
            .on('end', function(){
                // Only emit notes after query has been completed
                socket.emit('initial notes', notes)
            })

        isInitNotes = true
    } else {
        // Initial notes already exist, send out
        socket.emit('initial notes', notes)
    }

})

index.html:(认为问题出在我链接 socket.io.js 文件的方式上,或者在我声明变量“socket”的代码行中)

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

    <!-- Script below works with my server I set up on local host
    <script src="http://localhost:3000/socket.io/socket.io.js"></script>-->

    <!-- script below properly links to the socket.io.js file in my directory, and throws no errors-->
    <script type= "node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>

        <script>
        $(document).ready(function(){
            var socket = io.connect('http://localhost:3000'); //LINE OF CODE IN QUESTION




        //Code below not really relevant to problem, but still part of my project.

        socket.on('initial notes', function(data){
            var html = ''
            for (var i = 0; i < data.length; i++){
                // We store html as a var then add to DOM after for efficiency
                html += '<li>' + data[i].Name + '</li>'
            }
            $('#notes').html(html)
        })

        // New note emitted, add it to our list of current notes
        socket.on('new note', function(data){
            $('#notes').append('<li>' + data.Name + '</li>')
        })

        // New socket connected, display new count on page
        socket.on('users connected', function(data){
            $('#usersConnected').html('Users connected: ' + data)
        })

        // Add a new (random) note, emit to server to let others know
        $('#newNote').click(function(){
            var newNote = 'This is a random ' + (Math.floor(Math.random() * 100) + 1)  + ' note'
            socket.emit('new note', {note: newNote})
        })
    })
    </script>
    <ul id="notes"></ul>
    <div id="usersConnected"></div>
    <div id="newNote">Create a new note:</div

解决了!

想通了。我使用“script src="my servers ip address:3000/socket.io/socket.io.js" 然后将变量 socket 更改为 var socket = io.connect('Servers ip address:3000'); 所以答案就是把 localhost 一起拿出来。

【问题讨论】:

    标签: mysql node.js socket.io localhost backend


    【解决方案1】:

    如果 Socket.io 在本地工作,我认为从您的服务器加载 Socket.io 可能会出现问题(可能是权限问题?),请尝试从 Socket.io CDN 加载它以进行测试。

    <script src="http://cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>
    

    【讨论】:

    • 谢谢,我之前尝试过那个确切的链接,不幸的是它抛出了一个错误。我已经探索了在这个网站上可以找到的所有链接到 socket.io 的选项。你觉得我使用 localhost 在我的 index.html 文件中声明套接字变量的方式有什么问题吗?
    • 你为什么要尝试 "script src="localhost:3000/socket.io/socket.io.js" ?在端口 3000 中你有 Socket.io 监听,而不是你的服务器,除非你有 Socket .io 和你的服务器在同一个端口上监听(他们不应该),这可能是问题吗?
    • 也许,我注释掉了该链接,因为它在我设置的本地服务器上工作,但是当我将文件移动到实际服务器时,该链接引发了错误。正确链接到我发现的 socket.io.js 文件的唯一解决方案是直接链接到它在目录中的位置(这是我未注释的链接)。我不应该在 index.html 中的变量“socket”声明中使用端口 3000 吗?谢谢!
    • 好吧,如果你说它在本地工作,那应该不是问题,你可以试试var socket = new io.Socket("127.0.0.1", {port:3000}); socket.connect(); 试试,也许你的服务器上的“localhost”没有正确配置。使用ip。
    • 想通了。我使用“script src="my servers ip address:3000/socket.io/socket.io.js" 然后将 var socket 更改为 var socket = io.connect('Servers ip address:3000'); 所以答案是一起取出localhost。感谢您的帮助!
    猜你喜欢
    • 2016-01-12
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多