node.js - 如何在浏览器上显示不断更新的文件?

标签 node.js socket.io

我的目标是用一些文件更新网页。当我编辑并保存文件时,其内容会立即更新到页面。

我正在使用 socket.io 来处理此问题。但。我需要对我的代码进行一些修改才能接近它。

::我的服务器端代码:

var PORT = 8001;
var io = require("socket.io").listen(PORT);
var fs = require("fs");

io.sockets.on('connection', function(socket) {
    console.log("Connected!");
    socket.emit('connected', { accept: true});

    console.log("Trying to send a content file to client...");
    fs.readFile("file.txt","UTF-8", function(err, data) {
        if (err) throw err;
        socket.emit("requestFile", data );
        console.log("Conteúdo:", data);
    })
});

console.log("Application has started! Port: " + PORT);

::我的页面

<html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js"></script>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style>
            .arquivo {
                font-family: Arial, Helvetica, sans-serif;
                font-size: 14px;
                width: 900px;
                border: 2px solid black;
                -moz-border-radius: 3px;
            }
        </style>
        <script type="text/javascript">
            console.log("Try to logon...");
            var socket = io.connect("localhost", {"port" : "8001"});

            socket.on("connected", function(data) {
                console.log("Connected User?", data.accept);
            });

            //recebe o arquivo indefinidamente
            var requestFile = socket.on("requestFile", function(data) {
                $("#arquivoSaida").html(data + "<br/>");
                console.log(data);
            });

            setInterval(requestFile, 200);
        </script>
    </head>
    <body>
        <h3 style="font: Arial, Verdana; font-size: 14px; font-weight: bold;">
            File updated:
        </h3>
        <div id="arquivoSaida">

        </div>      
    </body>
</html>

我使用 setInterval 以 200 毫秒触发,向服务器请求文件。任何提示都会非常受欢迎。

提前致谢!

-- 更新了解决方案:

::我对原始代码做了一些修改。该解决方案由 PuerkitoBio 提供。谢谢,伙计!

更新的代码:

var PORT = 8001;
var io = require("socket.io").listen(PORT);
var fs = require("fs");

io.sockets.on('connection', function(socket) {
    console.log("Connected!");
    socket.emit('connected', { accept: true});

    console.log("Trying to send the content to a client...");
    console.log("dir", __dirname);

    fs.watch(__dirname + "/arquivo.txt", function(event, filename) {
        console.log("Event:", event);

        if (event == "change") {
            fs.readFile("arquivo.txt","UTF-8", function(err, data) {
                if (err) throw err;
                socket.emit("receiveFile", data );
                console.log("Content:", data);
            })
        }

    });

});

console.log("Application has started! Port: " + PORT);

最佳答案

您可以使用fs.watchFile()并将curr.mtime与prev.mtime进行比较来检测文件是否已被修改。然后使用 readFile 将内容发送到连接的客户端。 From the docs

使用套接字,您不会从客户端轮询数据,而是在需要时从服务器推送数据(在您的情况下,当您的文件更改时)。因此,您不需要客户端的 setInterval (您将使用 fs.watchFile 监视服务器端的更改,并将内容推送到客户端,因此客户端上的“requestFile”处理程序将被自动调用(应该是重命名为 receiveFile 或其他更准确的名称!)。

关于node.js - 如何在浏览器上显示不断更新的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548223/

相关文章:

node.js - 我应该在哪里保存客户端的 JWT 以供将来请求?

node.js - 如何使用 Sequelize 查询某个类别下的所有产品(包括子类别的产品)

javascript - Node.js 如何同步返回 REST Web 服务响应?

node.js - extraHeaders 在 socket.io-client 中不起作用

Node.js 多服务器集群 : how to share object in several nodes cluster

javascript - if 语句中的正则表达式验证

node.js - Centos 7安装strongloop报错

c++ - 如何减少 golang tcp 服务器中的 cpu 使用率?

ubuntu - 如何在 node.js npm 服务器上查看 socket.io 版本

javascript - 是否有通过 websockets 管理资源的既定模式?