sockets.io 发出消息延迟到 post 完成

sockets.io emit messages are delayed till post is finished

我正在上传文件(使用 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))) + '%';
        }

一旦您的 post 访问服务器,它将 运行 阻止

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

这意味着您将立即获得

io.emit('message',{'message': 'upload completed !'});

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

那你稍等 运行s

audio_code(newPath );

没有输出。
然后当 audio_code 完成时你会得到 到最后。

你在 audio_code 中发出任何进展吗?如果不是,那就是为什么你没有进度增量。

我解决了这个问题。从套接字切换到 primus 向我表明,由于我的代码有点计算密集,并且 运行 同步地阻塞服务器足够长的时间,以便 websocket 超时并关闭。所以我所要做的就是增加允许服务器在超时之前响应乒乓检查的时间。