大多数服务器端脚本语言都有exec函数(node,php,ruby等)。这允许编程语言与shell交互。
我希望在node.js中使用exec()
来运行大型进程,这是我以前在浏览器中对AJAX请求所做的事情。我想要一个简单的进度/加载栏来向用户显示进度。
我在下面的例子中发现了一个很难的方法,exec
函数的回调/异步性质会使这个例子需要5秒以上才能加载。
我想要的是一些方法来获取浏览器的内容(ajax)与执行的当前状态,如加载栏。但我不希望运行文件依赖于浏览器。
有什么想法吗?
我的路线
exports.exec = function(req,res){
// http://nodejs.org/api.html#_child_processes
var sys = require('sys')
var exec = require('child_process').exec;
var child;
child = exec("node exec/test.js", function (error, stdout, stderr) {
var o = {
"error":error,
"stdout":stdout,
"stderr":stderr,
};
o = JSON.stringify(o);
res.send(o);
});
};
我的test.js文件
var sys = require('sys');
var count = 0;
var interval = setInterval(
function(){
sys.print('hello'+count);
count++
if(count == 5){
clearInterval(interval);
}
},
1000);
答案 0 :(得分:6)
您应该使用socket.io。 这是一个demo app,可以帮助您开始使用socket.io
使用socket.io为每1%发出一个事件,浏览器会监听它并更新一个条。
你不能使用exec你需要一个流输出。
因此,您宁愿使用child_process。
在服务器上。
var spawn = require('child_process').spawn,
exec = spawn('node exec/test.js');
exec.stdout.on('data', function (message) {
socket.emit('process', message);
});
关于子流程:
console.log('10%')
// ...
console.log('20%')
// ...
console.log('30%')
如果您的子流程是一个节点脚本,您可以做一些更优雅的事情。 您可以使用节点的cluster模块在主进程和从进程之间发送消息,而不必与流标准进行通信。
我在之前的演示应用程序中添加了fork,添加了一个路由/执行文件,演示如何实现此目的。
当我有更多时间制作另一个演示应用程序时,这是一个非常有趣且有教育意义的测试。谢谢你的想法:D。