【问题标题】:sockets.io emit messages are delayed till post is finishedsockets.io 发出消息被延迟到帖子完成
【发布时间】:2016-02-05 02:09:05
【问题描述】:

我正在上传一个文件(使用 multer)并对其进行一些处理,我想在处理它的同时显示进度。我的问题是客户端在处理完成后收到所有更新。所以进度条会从 0 变为 100%,而不是随着代码的进行而增量更新。

服务器端

var multer  = require('multer')
var uploading = multer({ dest: 'uploads/' })


app.post('/result', uploading.single('audio'), function(req, res) {
    var oldPath = req.file.path;
    var newPath = req.file.destination + req.file.originalname;
    fs.renameSync(oldPath, newPath)
    var ext = newPath.substring(newPath.length-3);
    io.emit('message',{'message': 'upload completed !'});
    console.log('1st update');
    if (ext =='mp3' || ext == 'wav')
    {
        //console.log('running audio code');
        io.emit('update',{'step': 'Converting Audio',percent: 2/10});
        audio_code(newPath );
        //res.render('Results_Audio', { });
    }
    else if (ext =='avi' || ext == 'mp4')
    {
        console.log('run video code');
        res.render('Results_Video', { });
    }
}); 

在客户端

socket.on('update',function(data) {
        console.log(data);
        Update(data);});

    function Update(data){
        document.getElementById('NameArea').innerHTML = data.step;
        console.log(data.percent*100);
        document.getElementById('ProgressBar').style.width = data.percent*100 + '%';
        document.getElementById('percent').innerHTML = (Math.round((data.percent*100))) + '%';
        }

【问题讨论】:

  • 我是新手,所以我可能错过了一个简单的概念
  • 您如何发布数据?你能显示那个代码吗?我的猜测是这是一个阻塞调用
  • @greg_diesel 我正在使用 multer 我已在问题中添加了该信息
  • audio_code(newPath ); 运行需要多长时间?
  • 这需要几分钟,具体取决于上传文件的大小,这就是为什么我发出更新消息以显示代码所在的步骤以及完成了多少

标签: sockets post express socket.io multer


【解决方案1】:

一旦你的帖子到达服务器,它就会运行块

app.post('/result', uploading.single('audio'), function(req, res) { ... }

这意味着您将立即获得

io.emit('message',{'message': '上传完成!'});

io.emit('update',{'step': 'Converting Audio',percent: 2/10});

然后你等待它运行

audio_code(newPath);

没有输出。
那么当audio_code完成时你会得到 到终点。

您是否在 audio_code 内部发布任何进展?如果没有,那么这就是您没有进度增量的原因。

【讨论】:

  • 实际上上传完成发射和更新发射是在代码完成后与音频代码内部发送的更新发射一起接收的。我还应该说,从任何一方发送的任何发射都会在文件发布之前及时收到
【解决方案2】:

我解决了这个问题。从 socket 切换到 primus 向我表明,由于我的代码计算量很大并且同步运行,它阻塞了服务器足够长的时间,以使 websocket 超时并关闭。所以我所要做的就是增加服务器在超时前响应乒乓检查的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多