我知道this stackoverflow的答案,我一直用它来帮助我。 然而,当我将代码应用于我的情况时会发生一些奇怪的事情。 看起来我的代码中名为execSync的wrapAsync函数运行并输出它应该的内容;然而,它刚刚完成,就像我之前使用wrapAsync一样。
代码
SELECT GROUP_CONCAT(t_author.aut_name) as authors, t_genre.genre_name as genre FROM t_author
LEFT JOIN t_genre ON t_author.aut_genre = t_genre.genre_id
GROUP BY t_author.aut_genre
**输出**
Meteor.methods({
'distinctSpecs'({}){
console.log("called");
var json_categories_clean = [];
var execSync =
Meteor.wrapAsync(require("child_process").exec,
require("child_process"))
var returned_data =
execSync(
"mongo products --eval \"var collection='laptops', outputFormat='json'\" variety.js",
{ cwd:"/home/jonathan/Documents/variety-master"},
(err, stdout, stderr) => {
if (err) {
console.error(err);
console.log(stdout);
console.log(stderr);
return;
}
console.log("waited for this");
var json_categories =
JSON.parse(stdout.substring(
stdout.indexOf('[', stdout.indexOf('[')+1),
stdout.lastIndexOf(']')+1));
for (var x=0; x < json_categories.length; x++) {
json_categories_clean.push(json_categories[x]["_id"])
}
console.log("returning inner");
return json_categories_clean;
});
console.log("returning outer");
return returned_data;
}
});
答案 0 :(得分:1)
格式化代码后,很明显您正在调用wrapAsync
错误:
Meteor.wrapAsync(require("child_process").exec,
require("child_process"))
你可能想要:
const exec = Npm.require("child_process").exec;
Meteor.wrapAsync(a, b, function(callback) {
exec(a, b, function(err, stdout, stderr) {
callback(err, stdout);
});
});
您包装的函数的最后一个参数需要是一个函数,它将错误和结果作为参数(而不是其他)。
此外,一旦您拥有异步功能,您就不再提供回叫。你正在等待返回。