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。 在此先感谢您的帮助!
答案 0 :(得分:1)
对于你的一个问题:
这是构建我的RESTful API的最佳方式吗?一个电话 更新的行动和另一个检查的进展 更新
现在已实施,我认为您的服务无法正确支持并发请求。 updatePercent
是一个共享的全局变量。如果我使用单个客户端点击/update
端点,它将启动./update-log.sh
命令。
如果我再次请求/update
,它将启动另一次更新并覆盖全局updateProgress
。似乎没有任何东西映射updatePercent
正确的过程
此外,每个产生新流程的请求都可能存在严重的性能问题。节点可能能够使用单个线程处理数百或数千个并发连接,但每个请求将产生一个新进程,只需要分析