我想在我的应用程序中实现错误处理,但是当我抛出Meteor.Error时,我的服务器崩溃了。这可能是因为我正在使用未来等待结果。我该如何运行?
Meteor.methods({
'/app/pdf/download': function (url, name) {
check(url, String);
check(name, Match.Any);
if ( ! name) {
name = url.split('/').pop();
} else {
name += '.pdf';
}
var Future = Meteor.npmRequire('fibers/future');
var Download = Meteor.npmRequire('download');
var future = new Future();
var download = new Download({ extract: true, strip: 1 })
.get(url)
.dest(process.env.PWD + '/staticFiles')
.rename(name);
// Run download
download.run(function (err, files, stream) {
if (err) {
throw new Meteor.Error(500, 'Couldn\'t download file');
}
future.return(name);
});
return future.wait();
}
});
答案 0 :(得分:2)
是的,这是因为你把它扔进了另一个调用堆栈。
你可以尝试:
var error;
download.run(function (err, files, stream) {
if (err) {
error = err;
}
future.return(name);
});
var result = future.wait();
if (error)
throw new Meteor.Error(500, 'Couldn\'t download file');
return result;
无论哪种方式,我建议您使用Meteor.wrapAsync。
var sync = Meteor.wrapAsync(function (done) {
download.run(function (err, files, stream) {
if (err) {
done(new Meteor.Error(500, 'Couldn\'t download file'));
}
else {
done(err, name);
}
});
};
return sync();
如果您使用的是Meteor< 1.0,其Meteor._wrapAsync()
。