sockets.io emit消息延迟到post完成

sockets.io emit消息延迟到post完成,sockets,post,express,socket.io,multer,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) {

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

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

app.post('/result',upload.single('audio'),函数(req,res){
...
}

这意味着你会马上得到

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

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

然后你等着,等着它运行

音频编码(新路径)

没有输出任何内容。
当音频代码完成时,您将获得 坚持到底


您是否在
音频\u code
中发出任何进展?如果没有,则这就是为什么您没有获得任何进展增量。

我解决了这个问题。从socket切换到primus向我表明,由于我的代码计算量大,并且同步运行,它会阻塞服务器一段时间,足以让websocket超时nd close。因此,我所要做的就是在超时之前增加服务器响应乒乓球检查的时间。

我对这一点不熟悉,因此可能缺少一个简单的概念。您如何发布数据?您能显示该代码吗?我猜这是一个阻塞call@greg_diesel我用的是multer我在问题How lon中添加了这个信息g不执行音频代码(新路径)运行需要几分钟?这取决于上传文件的大小,这就是为什么我要发出更新消息来显示代码的步骤和完成的程度。实际上,上传完成后发出和更新发出都是在代码完成后收到的,更新发出也在音频代码中发送。我还应该在文件发布之前,及时接收任何一方发送的任何发射