2017-05-22 1 views
0

Ich versuche, die stdout meiner Methode zurückzugeben, aber auf dem Client habe ich immer undefined, obwohl der Server sagt, es ist ein string mit Inhalt.Wie kann ein sdtout von einem Server zu einem Client innerhalb einer Zeichenfolge zurückgegeben werden?

ich das tun:

'getExistingFiles': function() { 
     var list = ""; 
     return new Promise(Meteor.bindEnvironment(function(resolve) { 
     child = exec_tool("ls -al", 
      function (error, stdout, stderr) { 
      if (error !== null) { 
       console.error('exec error: ' + error); 
       list = "error: " + error; 
       resolve(list); 
       return list; 
      }else{ 
       list = stdout; 
       console.log(typeof list); 
       console.log("LIST:------------"); 
       console.log(list); 
       resolve(list); 
       return list; 
      } 
      }); 
     })); 
} 

Auf meinem Terminal Ich habe die Protokolle: enter image description here

Aber auf dem Client, wenn ich versuche, den Wert zuzugreifen es undefined ist:

Meteor.call("getExistingFiles",function(list){ 
     console.log(list); 
     console.log(typeof list); 
}); 

Meine Frage ist also, wie kann ich diese list an den Client senden?

[EDIT] ich so versucht, zu testen, ob es mein Kunde war, der nicht in Ordnung war, aber nein, es ist auf dem Server denke ich

//server  
var et = Meteor.wrapAsync(exec_tool); 
try { 
    child = et('ls -al'); 
    console.log("LIST:------------"); 
    console.log(child); 
    console.log(typeof child); 
    return child; 
} catch (err) { 
    throw new Meteor.Error(err, err.stack); 
} 

[EDIT 2] auch wie dieser es eine undefined senden WARUM?!

var et = Meteor.wrapAsync(exec_tool); 
     try { 
     var proc = exec_tool("ls -al") 
     proc.stdout.on('data', function (data) { 
     //do something with data 
     console.log(data); 
     list = list + data; 
     }); 
     proc.stdout.on('end', function() { 
     console.log("end"); 
     console.log(list); 
     return list; 
     }); 
     } catch (err) { 
     throw new Meteor.Error(err, err.stack); 
     } 

Antwort

2

Auf dem Server (Versprechen vom Server ausgewertet und dann an den Client gesendet, wenn sie fertig sind):

getExistingFiles: function() { 
     return new Promise((resolve, reject) => { 
     child = exec_tool("ls -al", 
      function (error, stdout, stderr) { 
      if (error) { 
       reject(error); 
      } else { 
       resolve(stdout); 
      } 
      }); 
     })); 
} 

Und auf dem Client:

Meteor.call("getExistingFiles", function(err, list) { 
    if(err) { 
     // handle your error 
     throw err; 
    } 
    console.log(list); 
}); 

Promises nicht return haben. Rückrufe von asynchronen Funktionen haben normalerweise die Argumentliste function (error, result). Das gewünschte Ergebnis sollte also im zweiten Argument stehen. Versuchen Sie es so.

+0

es funktioniert! Vielen Dank – Jerome

+0

Gern geschehen! –

+0

könnten Sie einen Blick https://stackoverflow.com/questions/44156414/how-to-send-the-stderr-full-text-to-the-client-with-a-promise werfen, da ich Ihre Methode in einem verwenden anderen Anwendungsfall und ich kann den Fehler nicht erhalten – Jerome

0

Sieht aus wie dies eine Betrogene Frage von this

ist Prüfen Sie, ob dies für Sie arbeitet. Async-Funktion mit Glasfaser/Zukunft. Lassen Sie uns das ändern, falls Sie auf Probleme stoßen.

Server.js

// 
    // Load future from fibers 
    var Future = Npm.require("fibers/future"); 
    // Load exec 
    var exec = Npm.require("child_process").exec; 

    Meteor.methods({ 
    runListCommand: function() { 
     // This method call won't return immediately, it will wait for the 
     // asynchronous code to finish, so we call unblock to allow this client 
     // to queue other method calls (see Meteor docs) 
     this.unblock(); 
     var future=new Future(); 
     var command="cd /home/me/files/; ls *.svg"; 
     exec(command,function(error,stdout,stderr){ 
     if(error){ 
      console.log(error); 
      throw new Meteor.Error(500,command+" failed"); 
     } 
     future.return(stdout.toString()); 
     }); 
     return future.wait(); 
    } 
    }); 

Client.js:

Meteor.call('runListCommand', function (err, response) { 
    console.log(response); 
}); 
Verwandte Themen