Reputation: 1091
How can I achieve below?
server side:
execute bash commands to generate files. then return the path of file D
const exec = Meteor.isServer ? require('child_process').exec : undefined;
Meteor.methods({
createFile_D(){
const BashCommand_A = `generate file A`;
const BashCommand_B = `generate file B, using file A`;
const BashCommand_C = `generate file C, using file B`;
const BashCommand_D = `generate file D, using file C`;
const runCommand = function (cmd) {
let command = exec(cmd, path);
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
command.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
command.on('close', (code) => {
console.log(`child process exited with code ${code}`);
resolve('done');
})
}
// execute BashCommand A ~ D
// when it's all done return the path of file D
}
});
client side:
retrieve path of generated file D as a callback of Meteor.call
Meteor.call('createFile_D', function (error, result) {
if(error || (result === undefined)) {
throw error;
} else {
do_something_with_result (result);
}
});
Upvotes: 0
Views: 41
Reputation: 2702
Use Meteor.wrapAsync
or Async/Await:
const runCommand = (cmd) => {
return new Promise((resolve, reject) => {
// Make sure `path` variable is exists
let command = exec(cmd, path);
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
command.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
command.on('close', (code) => {
console.log(`child process exited with code ${code}`);
resolve(path);
})
});
};
Meteor.methods({
async createFile_D(){
const BashCommand_A = `generate file A`;
const BashCommand_B = `generate file B, using file A`;
const BashCommand_C = `generate file C, using file B`;
const BashCommand_D = `generate file D, using file C`;
await runCommand(BashCommand_A);
await runCommand(BashCommand_B);
await runCommand(BashCommand_C);
const path_D = await runCommand(BashCommand_D);
// path_D from resolve() in Promise
return path_D;
}
});
Read more info on await / async
Upvotes: 1