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

标签 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 将该程序放入一个循环中,这样我就可以在文件内容发生更改时立即发出信号。

也欢迎对此代码提出任何其他评论。我是 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 是一个默认事件,它向所有连接的客户端发送数据,您可以在 io.sockets.on('connection') 范围之外使用它

我认为您可以使用 chokidar.js 检测文件更改。 每次文件更改时,都会触发一个事件,您可以在其中触发“新闻”事件。 您也可以通过以下方式检测它:

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

希望这有效!

关于node.js 无需刷新即可获取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21768579/

相关文章:

javascript - Node 和惰性 : How do I know when it's done?

javascript - Babelify 在从 node_modules 导入模块时抛出 ParseError

javascript - MongoDB : multiple indexes or multiple collections 哪个更好

node.js - LetsEncrypt 适用于 IP 但不适用于域(greenlock,express)

node.js - 在 Hapijs 中我应该遵循什么文件夹结构?

javascript - 语法错误 :invalid o unexpeted toked

android - 如何在 Node 服务器中处理 FCM 上游消息?

javascript - Node.js 虚拟机和外部方法

node.js - 在 Node js 应用程序中加载 backbone.js

node.js - Openwhisk 无法调用 compose postgresql