【问题标题】:Socket.io Multiple messages emitted from one eventSocket.io 一个事件发出多条消息
【发布时间】:2014-07-21 17:43:05
【问题描述】:

我一直在寻找解决方案,但还没有找到任何东西。

每次服务器看到指定目录中的文件已更改时,我都会尝试从服务器发出消息。但是,它不是只发出一条消息,而是坚持发出三遍相同的消息。我正在使用 chokidar 观看目录,并在“更改”事件中发出消息。
服务器端代码:

var   express = require('express')
    , app = express()
    , http = require('http')
    , server = http.Server(app)
    , io =require('socket.io')(server)
    , chokidar = require('chokidar');
server.listen(1234);
app.use('/public', express.static( __dirname + '/public'));
app.get('/', function(request, response){
    var ipAddress = request.socket.remoteAddress;
    console.log("New express connection from: " + ipAddress);
    response.sendfile(__dirname + '/public/index.html'); //Server client
});




 var watcher = chokidar.watch("temp", {ignored: /[\/\\]\./, persistent: true});

    watcher.on('change', function(path){
        console.log(path + " has changed.");
        fs.readFile(path,'utf8', function(err, data){
            if(err) {
                return console.log(err);
            }
            else
            {
                var json = JSON.parse(data), recPsec, type;
                recPsec = json.data[0].values[0];
                type = json.data[0].values[16];
                var compiled = {
                                                    "recPsec" : recPsec,
                                                    "type"      : type
                                             }
                var jsonMessage = JSON.stringify(compiled)
                io.sockets.emit('message', JSON.stringify(jsonMessage));
                console.log("Sent message");
            }

        });

    });
watcher.on('unlink', function(path){
    console.log('File: ', path, ' has been removed');
});

watcher.on('add', function(path){
    console.log("hi");
    fs.readFile(path,'utf8', function(err, data){
        if(err) {
            return console.log(err);
        }
        else
        {
        var json = JSON.parse(data), recPsec, type;
            recPsec = json.data[0].values[0];
            type = json.data[0].values[16];
            var compiled = {
                                                "recPsec" : recPsec,
                                                "type"      : type
                                         }
            var jsonMessage = compiled;
            io.sockets.emit('message', JSON.stringify(jsonMessage));
            console.log("message sent");
        }
        //fs.unlinkSync(path);
    });
});

客户端:

 var socket = io.connect('http://localhost');
        socket.on('message', function(data){
            console.log(data);
            var parsed = JSON.parse(data);
            recPsecNew = parsed.recPsec;
            typeNew = parsed.type;
            analyze(recPsecNew, typeNew);
        });

我将 socket.io 与 express 4 结合使用。 在这里可以找到 Chokidar:https://github.com/paulmillr/chokidar

如果我两次更改文件名,控制台的日志会显示在此处:http://s000.tinyupload.com/?file_id=95726281991906625675

【问题讨论】:

  • console.log(path + " has changed.");是不是也叫了3次?
  • 不,它只被调用一次。我相信错误可能来自 watcher.on('add', function(path){....
  • 对于我在一些自定义 redis 发布-订阅事件处理程序后面的 socket.io 遇到同样的错误是值得的。根据 redis 消息处理程序中的日志,redis 事件仅触发一次,但相应的 websocket 也会收到 3 条消息。祝你好运,我也很想在这里回答。
  • @batchi 你能添加你的控制台输出和socket.io日志吗?应该很容易找到导致带有该信息的额外消息的原因。
  • 这方面有什么更新吗?我正在经历这种情况,这让我很头疼。

标签: javascript node.js express socket.io


【解决方案1】:

你试过lodash的函数吗?

或许你可以使用lodash.debounce函数

根据其文档:

_.debounce(func, [wait=0], [options])

创建一个去抖动函数,该函数延迟调用 func 直到自上次调用去抖动函数后等待毫秒过去。 debounced 函数带有一个取消延迟调用的取消方法。提供一个选项对象以指示 func 应该在等待超时的前沿和/或后沿调用。对 debounced 函数的后续调用将返回最后一次 func 调用的结果。

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2019-10-30
    • 1970-01-01
    • 2013-06-08
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多