Правильная обработка ошибок Meteor с асинхронными вызовами с использованием Future

Мне интересно, как правильно обрабатывать ошибки с Meteor при использовании асинхронных методов. Я пробовал следующее, но ошибка возвращается в параметре результата обратного вызова клиента вместо параметра ошибки.

Код сервера:

Future = Npm.require('fibers/future');

Meteor.methods({
    'myServerMethod': function(){
        var future = new Future();

        // URL to some remote API
        var url = UrlOfTheApiIWantToCall;

        HTTP.get(url, {//other params as a hash},
            function (error, result) {
                if (!error) {
                    future.return(result);
                } else {
                    future.return(error);
                }
            }
        );

        return future.wait();
    }
});

Код клиента:

Meteor.call('myServerMethod', function (error, result) {
    if(error){
        console.warn(error);
    }

    console.log('result', result);
});

Как я уже говорил выше, "ошибка" всегда неопределена в случае события на стороне клиента, когда HTTP.get() на стороне сервера возвращает ошибку. Я тоже пробовал заменить future.return(error); с future.throw(error); на стороне сервера, но это действительно выдает ошибку на стороне сервера. Затем параметр ошибки на стороне клиента получает ошибку 500 Server, хотя на сервере была выдана ошибка 401 Unauthorized error.

Итак, возможно ли правильно использовать Fibre Future, чтобы клиентский обратный вызов получал тот же параметр ошибки, что и обратный вызов сервера?

1 ответ

Согласно Meteor.Error документы на http://docs.meteor.com/

Методы могут генерировать любые исключения. Но Meteor.Error - единственная ошибка, которую сервер отправляет клиенту. Если функция метода выдает другое исключение, то оно будет сопоставлено с очищенной версией на проводе. В частности, если в поле sanitizedError для сгенерированной ошибки задано значение Meteor.Error, то эта ошибка будет отправлена ​​клиенту. В противном случае, если очищенная версия недоступна, клиент получает Meteor.Error(500, "Внутренняя ошибка сервера").

Вот почему вы получаете 500 Server Error на клиенте. Если вы хотите сохранить сообщение об ошибке и отправить его клиенту, вы можете сделать что-то вроде этого:

Future = Npm.require('fibers/future');

Meteor.methods({
    'myServerMethod': function(){
        var future = new Future();

        // URL to some remote API
        var url = UrlOfTheApiIWantToCall;

        HTTP.get(url, {//other params as a hash},
            function (error, result) {
                if (!error) {
                    future.return(result);
                } else {
                    future.throw(error);
                }
            }
        );

        try {
            return future.wait();
        }
        catch(err) {
            // Replace this with whatever you want sent to the client.
            throw new Meteor.Error("http-error", err);
        }
    }
});
Другие вопросы по тегам