NodeJS reads and parses each stdout line

I have a NodeJS script that runs a child process to dump a file:

var exec = require('child_process').exec; var result = ''; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { result = stdout.split("="); }); 

If in case the file is missing, I would take a dump of another file:

 var result = ''; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { result = stdout.split("="); if(stdout.indexOf('No such file or directory') != -1){ var child = exec('./scripts/second.sh', function(err, stdout, stderr) { result = stdout.split("="); }); }); 

Finally, I register the value of the result variable:

 console.log(result); 

Files will have such data as indicated below:

 line_1 = 7888 line_2 = 8998 line_3 = 9090 line_4 = 9097 

Do I need to parse and extract the values โ€‹โ€‹of line_1 and line_3?

There is no value in the result variable. My idea was to get the stdout data in a string variable and use some kind of search mechanism.

Although I'm not sure about this approach, as I am not very versed in JS / NodeJS.

== == EDIT

Find a replica of the function I wrote.

 var exec = require('child_process').exec; function getdetail() { var result = ''; var child = exec('./scripts/first.sh', function(err, stdout, stderr) { if(stdout.indexOf('No such file or directory') != -1){ var child = exec('./scripts/second.sh',function(err, stdout, stderr) { result = stdout.toString().split("="); console.log(result); }); } else { result = stdout.toString().split("="); console.log(result); } }); } 

The toaster () on the stdout stream object did the trick, but I get console logs as follows:

 [ 'spawn ssh -o UserKnownHostsFile', '/dev/null -o StrictHostKeyChecking', 'no user@www.mybox.com cat ver.txt\r\nWarning: Permanently added \'www.mybox.com,XX.XX.XX.XX\' (RSA) to the list of known hosts.\r\r\ nuser@www.mybox.com \ password: \r\line_1', '9400\r\nline_2', '3508\r\nline_3', '77f3\r\nline_4', '/tmp\r\nline_5', '/tmp/ramdisk/\r\nline_5', '77f3\r\n' ] 

How can I extract the value of line_1 and line_3?

+4
source share
1 answer

exec is asynchronous. Thus, if you write something like:

 var result = ''; var child = exec('...'), function() { result = 'abc'; } ); console.log(result); 

Then result can be empty, because console.log(result) can and will often be executed before exec returns to the callback and writes a new value.

To fix this, you need to process the result asynchronously in the exec callback function.

Also I'm not sure what the best way to check for errors. Instead of checking "there is no such file or directory", you can simply check if err value other than zero:

 if(err) { 

Combining all this, we get the following code:

 var exec = require('child_process').exec; var result = ''; var processResult = function(stdout) { var result = stdout.split("="); console.log(result); }; var child = exec('./scripts/first.sh',function(err, stdout, stderr) { if(err) { var child = exec('./scripts/second.sh', function(err, stdout, stderr) { processResult(stdout); }); } else { processResult(stdout); } }); 

If you need to continue processing stdout data, you need to iterate to find out all possible occurrences of strings containing "key = value". Here is a rough idea:

 var processResult = function(stdout) { var lines = stdout.toString().split('\n'); var results = new Array(); lines.forEach(function(line) { var parts = line.split('='); results[parts[0]] = parts[1]; }); console.log(results); }; 

Hope this helps you.

+10
source

Source: https://habr.com/ru/post/1440542/


All Articles