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