2016-11-08 1 views

Antwort

0

Also hier ist, was ich getan habe.

Ich wickelte ein großes Dienstprogramm cross-spawn in mein eigenes Modul.

exec.js

var spawn = require('cross-spawn'); 
 
var util = require('util'); 
 
const Sugar = require('sugar'); 
 

 
// parses the output if it is in JSON format 
 
function parse(str){ 
 
    var outStr = str, res; 
 
    try { 
 
     res = JSON.parse(outStr.trim()); 
 
    } catch (error) { 
 
     res = outStr; 
 
    } 
 

 
    return res; 
 
} 
 

 
module.exports = { 
 
    spawn() { 
 
     var args = Array.prototype.slice.call(arguments); 
 
     return new Promise(function (resolve, reject) { 
 
      var stdout = '', stderr = ''; 
 
      var cp = spawn.apply(null, args); 
 
      cp.stdout.on('data', function (chunk) { 
 
       var res = parse(chunk.toString()); 
 
       if (!res.result && res.commandOutput) { // pretty log 
 
        console.log(util.inspect(Sugar.Object.filter(res, (val, key) => key !== 'commandOutput'),{colors: true, depth:null})); 
 
        console.log(res.commandOutput); 
 
       } else console.log(res); 
 

 
       stdout += chunk; 
 
      }); 
 
      cp.stderr.on('data', function (chunk) { 
 
       console.error(chunk.toString()); 
 
       stderr += chunk; 
 
      }); 
 
      cp.on('error', (e)=>{ 
 
       reject((stderr && new Error(stderr)) || e); 
 
      }) 
 
       .on('close', function (code) { 
 
        let output = parse(stdout); 
 
        if (code === 0) { 
 
         resolve(output); 
 
        } else { 
 
         let err = (output && output.errorMsg && new Error(output.errorMsg)) || new Error(stderr); 
 
         console.error(err); 
 
         reject(err); 
 
        } 
 
       }); 
 
     }); 
 
    }, 
 
};

und dann wie jede normale exec Versprechen Shell ich es einfach verwenden:

const exec = require('./lib/exec'); ... function execAndLog(){ ... return exec.spawn(...execArgs, opts).then(processOutput); }

Verwandte Themen