我正在上传一个文件(使用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))) + '%';
}
答案 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超时并关闭。所以我所要做的就是增加服务器在超时之前响应乒乓检查的时间。