0

大多数服务器端脚本语言都有一个 exec 函数(nodephpruby​​ 等)。这允许编程语言与外壳交互。

我希望exec()在 node.js 中使用来运行大型进程,我曾经在浏览器中处理 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);
4

1 回答 1

6

您应该为此使用socket.io。这是一个演示应用程序,可帮助您开始使用 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%')

如果你的子进程是一个节点脚本,你可以做一些更优雅的事情。您可以使用节点的集群模块在主进程和从属进程之间发送消息,而不必与流标准输出对话。

我做了一个前一个演示应用程序的分支,添加了一个路由 /exec 来演示如何实现这一点。

When I'll have more time I'll make another demo app, this is a quite interesting and educational test. Thanks for the idea :D.

于 2012-08-24T02:41:51.730 回答