Метеор не выдает ошибку, а вылетает

Я хочу реализовать обработку ошибок в моем приложении, но когда я выкидываю 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 ответ

Решение

Да, это потому, что вы бросаете его в другой стек вызовов.

Вы можете попробовать:

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(),

Другие вопросы по тегам