Javascript 如何在字符串内将sdtout从服务器返回到客户端?

Javascript 如何在字符串内将sdtout从服务器返回到客户端?,javascript,string,meteor,promise,client-server,Javascript,String,Meteor,Promise,Client Server,我试图返回方法的stdout,但在客户端上,我总是有undefined,尽管服务器说它是一个包含内容的字符串 我这样做: 'getExistingFiles': function () { var list = ""; return new Promise(Meteor.bindEnvironment(function(resolve) { child = exec_tool("ls -al", function (error, std

我试图返回方法的
stdout
,但在客户端上,我总是有
undefined
,尽管服务器说它是一个包含内容的
字符串

我这样做:

'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;
            }
          });
      }));
}
在我的终端上,我有以下日志:

但在客户端,当我尝试访问该值时,它是未定义的:

Meteor.call("getExistingFiles",function(list){
       console.log(list);
       console.log(typeof list);
});
所以我的问题是,我如何才能将这个
列表
发送给客户机

[编辑]我试着这样做是为了测试是不是我的客户出错了,但我想不是服务器上的错

//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);
}
[EDIT2]即使这样,它也会发送一个
未定义的
为什么

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);
      }
在服务器上(来自服务器的承诺将被评估,然后在完成时发送到客户端):

关于客户:

Meteor.call("getExistingFiles", function(err, list) {
    if(err) {
        // handle your error
        throw err;
    }
    console.log(list);
});
承诺没有
回报
。来自异步函数的回调通常具有
函数(错误、结果)
参数列表。因此,想要的结果应该在第二个参数中。像这样尝试。

在服务器上(来自服务器的承诺将被评估,然后在完成后发送到客户端):

关于客户:

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

承诺没有
回报
。来自异步函数的回调通常具有
函数(错误、结果)
参数列表。因此,想要的结果应该在第二个参数中。像这样试试。

看起来这是一个愚蠢的问题

看看这是否适合你。使用光纤/未来的异步功能。让我们调整一下,以防遇到问题

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);
});

看来这是个骗人的问题

看看这是否适合你。使用光纤/未来的异步功能。让我们调整一下,以防遇到问题

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);
});
我在另一个用例中使用了你的方法,但无法获取错误内容。你能看一下吗?我在另一个用例中使用了你的方法,但无法获取错误内容