我怎样才能更新呈现的玉器进度?

我有一个表单小express.js应用程序。 提交时,它会运行一个python脚本,运行时需要5分钟才能运行,并将消息转储到stdout。 现在我可以调用它,并logging输出到控制台就好了。 我希望这些消息填充我的玉模板中的跨度区域(id = results),直到完成。

路线:

router.post('/create', function(req, res) { res.render('build', function(err, html) { res.send(html); var options = { mode: 'text', pythonPath: '/usr/bin/python', pythonOptions: ['-u'], scriptPath: '/test', args: ['test', '-t', req.body['type'], '-s', req.body['num'], req.body['name']] }; var shell = new py('build', options); shell.on('message', function (message) { console.log(message); }); shell.on('error', function(err) { console.log(err); }); }); }); 

玉:

 extends layout block content .container .panel.panel-default .panel-heading: h3 Requesting a new Build .panel-body p | <span id='results'></span> script(src='//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js') script(src='//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js') 

我已经尝试了res.render和res.send的不同变体,但是我认为我正在用那些树叫出错误的树。

我最终用socket.io解决了这个问题。 感谢您的快速提示@ j4g。 添加到我的app.js的结尾:

 var server = app.listen(3000); var io = require('socket.io').listen(server); // this tells socket.io to use our express server io.sockets.on('connection', function (socket) { console.log('A new user connected!'); }); app.set('socketio', io); 

然后在我的路线:

  var socketio = req.app.get('socketio'); shell.on('message', function (message) { socketio.emit('message', message); }); shell.on('error', function(message) { console.log(message); socketio.emit('message', message); }); shell.on('close', function() { socketio.emit('finish', 'Process completed.'); 

然后在我的客户端JavaScript中,我添加了socket.io和这个自定义代码:

 var socket = io.connect(); socket.on('message', function (data) { $("#results").text(data); }); socket.on('finish', function (data) { $("#results").text(data); $("#prog").text("Finished!"); $(".progress-bar").removeClass('active').removeClass('progress-bar-striped'); }); 

我最终取代了我的跨文本,而不是追加它,但无论哪种方式,它按预期工作。 希望这可以帮助别人试图做同样的事情!