2014-11-07 5 views
1

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

ответ

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

Если вы используете Метеор < 1,0, его Meteor._wrapAsync().

+0

Спасибо, что работает :) – zimt28

Смежные вопросы