sockets.io发出的消息被延迟,直到post完成

时间:2016-01-14 00:06:55

标签: sockets post express socket.io multer

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

2 个答案:

答案 0 :(得分:0)

只要您的帖子点击服务器,它就会运行块

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

这意味着您将立即获得

  

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

     

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

然后你等一下这个

  

audio_code(newPath);

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

您是否在audio_code内发现任何进展?如果没有那么那就是你没有进步增量的原因。

答案 1 :(得分:0)

我解决了这个问题。从socket切换到primus告诉我,由于我的代码有点计算密集并且同步运行,因此它阻止了服务器一段时间,使websocket超时并关闭。所以我所要做的就是增加服务器在超时之前响应乒乓检查的时间。