2015-10-20 1 views
1

У меня есть метод Метеор:Meteor.call вызывает исключение даже с функцией обратного вызова

Meteor.methods({ 
    orderStatusUpdate: function(orderId, status, note) { 
    check(orderId, String); 

    var statusData = { 
     status: status, 
    } 
    if (note) { 
     statusData.statusNote = note; 
    } 
    check(statusData, SchemaCompiled.orderStatus); 

    Collections.orders.update({_id: orderId}, {$set: statusData}); 
    } 
}); 

с таможенной проверки на поле statusNote:

custom: function(){ 
    if (someCondition) { 
    return 'required'; 
    } 
    return false; 
} 

Моя проблема заключается в том, что даже с помощью функции обратного вызова определяется :

Meteor.call('orderStatusUpdate', orderId, orderStatus, note, function (error, result) { 
    // doing something 
} 

Исключение регистрируется в консоли:

Exception while simulating the effect of invoking 'orderStatusUpdate' errorClass {message: "Match error: Note is required", path: "", sanitizedError: errorClass, errorType: "Match.Error", invalidKeys: Array[1]} Error: Match error: Note is required

Как я понимаю, исключение возникает, когда я звоню check(...).

Как я могу поймать это исключение, чтобы правильно показать его клиенту?

BTW, функция обратного вызова также вызывается с помощью набора переменных error.

ответ

1

Исключенное/зарегистрированное исключение не имеет ничего общего с обратным вызовом или его отсутствием.

Если метод определен в общей папке (которая оценивается как клиентом, так и сервером), на клиенте будет запущен заглушка. Если он что-то бросает, ошибка обычно ломается и записывается на консоль.

Обратный вызов относится только к серверному запуску.

У вас есть несколько способов справиться с этим:

  1. Определить метод сервера только (в папке сервера).

    Это приведет к тому, что метод будет запущен только на сервере, поэтому ошибка будет получена на клиенте.

  2. Поймайте его на клиенте и сделайте что-нибудь об этом, как предложил @ChristianFritz.
  3. Используйте (в настоящее время) недокументированная особенность (throwStubExceptions), что, в случае, когда заглушка генерирует исключение, бросает исключение и предотвращает метод сервера от называют:

    как на клиенте и на сервере:

    Meteor.methods({ 
        thrower: function() { 
        throw 'catchMe!'; 
        } 
    }); 
    

    Затем на клиенте:

    try{ 
        Meteor.apply('thrower', [], {throwStubExceptions: true}, function(err, res){ 
        console.log('err!', err); 
        }) 
    } catch(e) { 
        console.log('caught', e); 
    } 
    

    Этот код будет отлавливать ошибку и лог caught catchMe! и метод не будет вызывается на сервере.

+0

выглядит симпатично идеей stubException, но как я могу сказать autoForm, чтобы пометить поле с недопустимой ошибкой и показать ошибку в этом случае? – Kostanos

+0

Я не уверен. AutoForm имеет форму типа метода, которая вызывает указанный вами метод, но я не использовал его. – MasterAM

+0

ваше решение (3) удаляет исключение, и, как вы сказали, это не вызывает метод на сервере после ошибки. Но он также не показывает ошибку в autoForm, когда с исключениями появляется ошибка в форме. Любая подсказка? – Kostanos

2

Почему бы не просто поймать его?

try { 
    check(statusData, SchemaCompiled.orderStatus); 
} catch (e) { 
    if (Meteor.isClient) { 
    alert(e); 
    } 
    if (Meteor.isServer) { 
    throw e; 
    } 
} 

Обратите внимание, что исключение в версии на моделируется метода, то есть на стороне клиента непосредственно. Исключение на стороне сервера будет передано в error обратного вызова, но код на стороне клиента будет выдаваться напрямую. Вышеупомянутое должно поймать это.

+0

В этом случае, как отправить сообщение об ошибке в autoForm вместо '' 'alert (e)' ''? – Kostanos

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

  • Нет связанных вопросов^_^