node.js - GET [[hostname]] / socket.io/1/ - 404(未找到)

时间:2013-07-31 17:19:02

标签: node.js socket.io

Socket.io似乎没有提供带有connect的socket.io.js文件。

这是我的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');

不确定是什么问题:/

2 个答案:

答案 0 :(得分: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);
        });
    });
});

答案 1 :(得分: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。事情是否恰当匹配?你确定吗?