【问题标题】:Parsing progress live from console output - NodeJS从控制台输出实时解析进度 - NodeJS
【发布时间】:2015-10-21 18:58:02
【问题描述】:

Link to a similar problem that has no answers, but written in C

我正在使用 NodeJS 解析来自 ark-server-tools 的输出,这是 SteamCMD 之上的一个层。我想做的是解析更新的进度并将其分配给一个变量,我将作为 GET 调用返回,客户端可以使用它来检查更新的进度。

我将更新的日志结果放入一个文件以运行我的代码,我已将其放入 PasteBin for brevity

update.js

app.get('/update', function(req, res) {
  var toReturn;
  var outputSoFar;
  var total;
  var startPos;
  var endPos = 0;

  //var proc = spawn('arkmanager', ['update', '--safe']);
  var proc = spawn('./update-log.sh'); //for testing purposes
  proc.stdout.on('data', function(data){
    outputSoFar += data.toString();


    //if server is already updated
    if (outputSoFar.indexOf('Your server is already up to date!') !== -1) {
      toReturn = 'Server is already up-to-date.';
    }

    //find update progress
    if (outputSoFar.indexOf('progress:') !== -1) {
      for(var line in outputSoFar.split('\n')){
        console.log('found progress');
        startPos = outputSoFar[line].indexOf('progress:', endPos) + 10; //get the value right after progress:_, which should be a number
        endPos = outputSoFar[line].indexOf(' (', startPos); // find the end of this value, which is signified by space + (
        console.log(outputSoFar[line].substring(startPos, endPos).trim());
        updatePercent = outputSoFar[line].substring(startPos, endPos).trim(); //returned to the `checkUpdateProgress` endpoint
      }

      toReturn = 'Updating...';
    }
  });

  proc.stderr.on('data', function(data){
    console.log(data);
  });

  proc.on('close', function (code, signal) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write(JSON.stringify(toReturn));
    res.end();
  });
}

/*
 * Returns progress of an update
 */
app.get('/updateProgress', function(req, res){
    console.log('updatePercent: ' + updatePercent);
    res.send(JSON.stringify(updatePercent));
});

几个问题:

1) 这是构建我的 RESTful API 的最佳方式吗?一个要求更新操作,另一个要求检查更新进度?

2) 我希望有一种更好的方法来测试该功能,因为回显控制台日志会返回一个整体的数据,而不是数据流。我该怎么做?

3) 我很确定解析函数本身并不完全正确,但由于#2,我很难对其进行测试。

如果您想查看整个项目,here's the repo。 提前感谢您的帮助!

【问题讨论】:

    标签: javascript node.js rest express steam


    【解决方案1】:

    对于您的一个问题:

    这是构建我的 RESTful API 的最佳方式吗?一次呼吁 更新操作和另一个用于检查进度的操作 更新?

    按照现在的实施,我认为您的服务不能正确支持并发请求。 updatePercent 是一个共享全局变量。如果我用单个客户端点击/update 端点,它将启动./update-log.sh 命令。

    如果我再次请求/update,它将开始另一个更新并覆盖全局updateProgress。似乎没有任何东西用正确的过程映射updatePercent

    此外,产生新进程的每个请求都可能存在严重的性能问题。 Node 可能能够使用单个线程处理数百或数千个并发连接,但每个请求都会产生一个新进程,只是需要分析一下

    【讨论】:

    • 好点 - 我应该先检查更新是否已经在进行中,然后?如果为真,则返回“更新已在进行中”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多