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

node.js无需刷新即可获取新数据,node.js,Node.js,我正在编写一个应用程序,在这个应用程序中,一旦文件内容发生变化,服务器就会自动发送新数据,而浏览器应该会显示这些数据。但是,我每次都需要使用“刷新”来找出新数据是什么。以下是客户端代码: <script> var socket = io.connect('http://192.168.1.91:8070'); socket.on('news', function (data) { console.log(data); d

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

<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>
这很奇怪,因为有时它能工作,但大多数时候我在测试它时它不能工作。我不知道是什么使它起作用。我还打算让watchFile kindda将这个程序放入一个循环中,一旦文件内容发生变化,我就可以从循环中发出信号

此外,欢迎对该代码提出任何其他意见。我不熟悉sockets.io和node.js,因此可能做得不对。。。提前谢谢你的回答


问题是,我怎样才能使浏览器在不刷新客户端的情况下更新数据。

您的方法不好,但这不是问题,因为您说您是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是一个默认事件,它向所有连接的客户端发送数据,您可以在('connection')上使用它

我认为您可以通过检测文件更改。 每次文件更改时,都会触发一个事件,您可以在那里触发“新闻”事件。 您还可以通过以下方式检测到它:

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

希望这能奏效

一条一般性意见是,您应该尽可能避免使用*Sync函数,尤其是readFileSync。js是非阻塞的,您使用它的方式是在读取该文件之前阻塞整个服务器(单线程,记得吗?)。对于性能来说不是很好。另外,我认为您的问题可能是您希望提取套接字变量,这样就可以从watchFile回调和socket.on('connection')回调中访问它。另外,我还要看看什么时候起作用。如果在第一次连接之前尝试保存文件更改,刷新是否有效?或者只在第一次连接socket.io之后才连接一次?关于保存更改,您是对的,它在其中一种情况下有效,但我不知道是什么时候,我只见过几次。至于把插座从插座里拔出来,我试过了,但还是不起作用。以下是我尝试的:var global_sock;on('connection',function(socket){global_sock=socket;});全局_sock.emit。。。但由于某种原因,它并没有起作用。也许你可以告诉我如何把它拉出来?当我删除if语句时,它开始实时更新浏览器。我仍然想知道如何使它更好,直到我想从sockets.on.connection中取出套接字。实际上,在旧代码中,在我删除了条件“if”语句之后,它开始工作。我想我试过你的版本,但没用,不过明天我会再试一次。使用您的方法,我如何触发sockets.on事件,以便在文件更新后立即触发emmit?我在代码中没有看到…很抱歉我没有注意到,我已经编辑了我的答案
fs.watch("c:\\sim", { persistent: true }, function (event, fileName) {
console.log("Event: " + event);
io.sockets.emit('news', text);
});