Meteor不会抛出错误但会崩溃

时间:2014-11-07 12:58:58

标签: asynchronous meteor npm node-fibers

我想在我的应用程序中实现错误处理,但是当我抛出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();
  }
});

1 个答案:

答案 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()