2013-07-31 85 views
1

Socket.io似乎沒有提供帶連接的socket.io.js文件。node.js - GET [[hostname]]/socket.io/1/ - 404(Not Found)

這裏是我的server.js代碼:

var app = require('http').createServer(handler), 
    io = require('socket.io').listen(app), 
    xml2js = require('xml2js'), 
    parser = new xml2js.Parser(), 
    fs = require('fs'); 

// creating the server (localhost:8000) 
app.listen(8080); 


// on server started we can load our client.html page 

function handler(req, res) { 
     console.log('liccy'); 

    fs.readFile(__dirname + '/', function(err, data) { 
    if (err) { 
     console.log(err); 
     res.writeHead(500); 
     return res.end('Error loading client.html'); 
    } 
    res.writeHead(200); 
    res.end(data); 
    }); 
} 

// creating a new websocket to keep the content updated without any AJAX request 
io.sockets.on('connection', function(socket) { 
    console.log(__dirname); 
    // watching the xml file 
    fs.watch(__dirname + '/example.xml', function(curr, prev) { 
    // on file change we can read the new xml 
    fs.readFile(__dirname + '/example.xml', function(err, data) { 
     if (err) throw err; 
     // parsing the new xml data and converting them into json file 
     parser.parseString(data); 
    }); 
    }); 
    // when the parser ends the parsing we are ready to send the new data to the frontend 
    parser.addListener('end', function(result) { 

    // adding the time of the last update 
    result.time = new Date(); 
    socket.volatile.emit('notification', result); 
    }); 
}); 

和我的html代碼:

<script src="/node/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script> 
    <script> 
    // creating a new websocket 
     var socket = io.connect('http://betty.dev'); 
     // on every message recived we print the new datas inside the #container div 
     socket.on('notification', function (data) { 
     $('.test').html(data.test.sample[0]); 
     $('time').html('Last Update:' + data.time); 
     }); 
    </script> 

我的XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<test> 
    <sample>Hi 1!</sample> 
</test> 

我得到這個錯誤時試圖加載該頁面:

info - socket.io started 
    debug - client authorized 
    info - handshake authorized HPdjzW_pVy49g0bD6azs 
    debug - setting request GET /socket.io/1/websocket/HPdjzW_pVy49g0bD6azs 
    debug - set heartbeat interval for client HPdjzW_pVy49g0bD6azs 
    debug - client authorized for 
    debug - websocket writing 1:: 
/Users/user/webserver/betty/www/node 

fs.js:1051 
    throw errnoException(process._errno, 'watch'); 

不知道是什麼問題:/

回答

3

這裏是修復我的問題:

var app = require('http').createServer(handler), 
    io = require('socket.io').listen(app), 
    fs = require('fs'), 
    homeFile = __dirname + '/home', 
    jsonFile = __dirname + '/home/data'; 
app.listen(8080, 'test.dev'); 

function handler(req, res) { 
    fs.readFile(homeFile, function(err, data) { 
     if (err) { 
      res.writeHead(500); 
      return res.end('Error loading home'); 
     } 

     res.writeHead(200); 
     res.end(data); 
    }); 
} 

io.sockets.on('connection', function(socket) { 
    fs.watchFile(jsonFile, function (curr, prev) { 
      console.log('the current mtime is: ' + curr.mtime); 
      console.log('the previous mtime was: ' + prev.mtime); 


     fs.readFile(jsonFile, function(err, data) { 
      if (err) throw err; 

      var data = JSON.parse(data); 
      socket.emit('notification', data); 
     }); 
    }); 
}); 
+0

我不認爲我可以「接受」我自己的答案:/ – Darkagelink

1

在瀏覽器試試這個網址:

<script src="/socket.io/socket.io.js"></script> 

(不,此URL不對應磁盤上的文件,但沒關係。 socket.io將正確地服務器瀏覽器JS)。

讓您的node_modules文件夾可供瀏覽器使用也不是必需或可取的。

更新

好了,你在你的<script>標籤固定在URL後,你現在有一個成功的socket.io WebSocket連接。好極了!現在,您的fs代碼正在拋出異常。對於一件事,如果你想readFile返回一個字符串,而不是一個緩衝區,你需要通過一個編碼:

fs.readFile(__dirname + '/example.xml', 'utf8', function(err, data) { 

更新2

所以fs.watch被拋出異常。可能你的路徑example.xml不能正確匹配真正的文件系統。您正在記錄__dirname。是否正確匹配?你確定?

+0

是啊,在socket.io東西現在工作,但在你的FS代碼中的錯誤。 –

+0

thx的更新,不幸的是,並沒有解決它... – Darkagelink

+0

@PeterLyons你知道你會怎麼做,當服務器在不同的端口,即:後端是localhost:9003,客戶端是localhost:9002? – Ken