2017-02-02 6 views
0

Ich bin ziemlich neu in NodeJS und das ist mein erstes Mal mit Express 4, ich versuche, eine einfache RESTful Front-End um eine Befehlszeile-Anwendung zu erstellen. Es wird letztendlich nur ein GET und ein POST benötigt, wobei der POST ungefähr 3 oder 4 verschiedene Parameter handhaben wird. Das GET sollte die Befehlszeilenanwendung mit allen Standardparametern aufrufen, was im Grunde nur eine Statusüberprüfung ist und den Beendigungsstatus nach Abschluss zurückgibt. Der POST wird POST-Parameter auf der Befehlszeile weiterleiten. Ich weiß, dass dies im Grunde einen asynchronen Aufruf wie child_process.execFile() erfordert, aber ich kann nicht herausfinden, wie die Antwort tatsächlich aus der Callback-Funktion zurückgegeben wird.NodeJS/Express GET Exit-Status der externen Anwendung

Dies ist das Tutorial, das ich als Ausgangspunkt verwendet habe, die Mungose-Abhängigkeit auslassen, weil ich keine Notwendigkeit für MongoDB habe, also habe ich es im Grunde nur bis zu dem Punkt gefolgt, wo Sie den Server starten. An diesem Punkt bin ich ziemlich verloren. Ich hasse immer Asynchron-Code zu schreiben ...

var express = require('express');  // call express 
var app  = express();     // define our app using express 
var bodyParser  = require('body-parser'); 
var child_process = require('child_process'); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

var port = process.env.PORT || 8080;  // set our port 

var router = express.Router();    // get an instance of the express Router 

router.get('/', function(req, res) { 
    res.json({ message: 'hooray! welcome to our api!' }); 
}); 

router.get('/myapp/status', function(req, res) { 
    console.log(req.user); 
    child_process.execFile(
      'casperjs', 
      ['myfile.js', '--cmd="Status"', '--user="myuser"', '--pass="#mypass"'], 
      null, 
      function(response) { 
       // ??? 
      }, res); 
}); 

app.use('/api', router); 

app.listen(port); 
console.log('Magic happens on port ' + port); 

Antwort

0

können Sie versuchen, die folgenden:

router.get('/myapp/status', function(req, res) { 
    console.log(req.user); 
    child_process.execFile(
     'casperjs', //command 
     ["myfile.js --cmd=Status --user=myuser --pass=#mypass"], // args 
     function(err, stdout, stderr) { //callback 
      if (err) { 
       return res.status(500).send(err); 
      } 
      res.send(stdout); // to send response to client 
     }); 
}); 
+0

Aber wie funktioniert die anonyme Callback-Funktion eine Ahnung, was res ist? Ich bin mir ziemlich sicher, dass ich ein paar ähnliche Ideen ausprobiert habe, und es hat immer mit "res hat keine Mitgliedfunktion senden" (oder etwas in diesem Sinne). Gibt es eine Möglichkeit, einen Verweis auf Res in den Rückruf zu übergeben? – qwertymodo

+0

aufgrund des Umfangs, Elternvariablen sind in kind anonymer Funktion zugänglich. Ich habe es versucht und es funktioniert. –

+0

Ok, nun scheint es so, als ob der Callback nie aufgerufen wird. Nur um zu bestätigen, habe ich die Syntax korrekt erhalten, vorausgesetzt, dass der externe Befehl, den ich aufrufe, 'casperjs myfile.js --cmd =" ​​Status "--user =" myuser "--pass =" #mypass "' – qwertymodo

Verwandte Themen