从控制台输出 - NodeJS实时解析进度

时间:2015-10-21 18:58:03

标签: javascript node.js rest express steam

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。 在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于你的一个问题:

  

这是构建我的RESTful API的最佳方式吗?一个电话   更新的行动和另一个检查的进展   更新

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

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

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