node.js无需刷新即可获取新数据

时间:2014-02-14 00:30:15

标签: node.js

我正在编写一个应用程序,一旦文件内容发生变化,服务器就会自动发送新数据,浏览器应该显示它。但是,我每次都需要使用“刷新”来查找新数据。这是客户端代码:

<script>
var socket = io.connect('http://192.168.1.91:8070');
socket.on('news', function (data) {
                console.log(data);
                document.forms['test form'].elements["txtStatus"].value = data;
});
</script>

这是服务器代码:

var http = require('http');
var io = require('/home/pi/node/lib/node_modules/socket.io');
var server;
var fs = require('fs');

server = http.createServer(function(req, res){
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('My first node app.');
  res.end();
}),

server.listen(8070);

var io = io.listen(server);

var prev_text;
var text =  fs.readFileSync('./current_temp','utf8');

io.sockets.on('connection', function (socket) {

socket.emit('news', text);
fs.watchFile('./current_temp', function (curr, prev) {
text = fs.readFileSync('./current_temp','utf8');
       if(prev_text != text){
                prev_text = text;
                socket.emit('news', text);
                console.log("text is :"+text);
        }
});


} );

它已经被人们用了,因为有时候它会起作用,但大部分时间它都不会在我测试时出现。我不知道是什么让它起作用。另外我打算让watchFile kindda把这个程序放在一个循环中,一旦文件内容发生变化,我就可以从中循环。

此代码也欢迎任何其他评论。我是sockets.io和node.js的新手,因此可能没有做正确的事情......提前感谢您的回答。

问题是,如何以浏览器更新数据而不在客户端刷新为止。

1 个答案:

答案 0 :(得分:2)

你的方法并不好,但这不是问题,因为你说你是socket.io的新手。您需要刷新页面,因为您没有以有意义的方式使用socket.io的默认事件。当您刷新页面时,客户端和服务器之间建立了新的连接,并且您正在那里触发“新闻”事件。这样做:

var prev_text;
var text =  fs.readFileSync('./current_temp','utf8');
fs.watchFile('./current_temp', function (curr, prev) {
text = fs.readFileSync('./current_temp','utf8');
   if(prev_text != text){
            prev_text = text;
            io.sockets.emit('news', text);
            console.log("text is :"+text);
    }
});
io.sockets.on('connection', function (socket) {
  socket.emit('news', text);
});

io.sockets.emit是一个默认事件,它向所有连接的客户端发送数据,您可以在io.sockets.on('connection')范围之外使用它

我认为您可以使用chokidar.js检测文件更改。 每次文件更改时,都会触发一个事件,您可以触发“新闻”事件。 你也可以用它来检测它:

fs.watch("c:\\sim", { persistent: true }, function (event, fileName) {
console.log("Event: " + event);
io.sockets.emit('news', text);
});

希望这有效!