2015-10-20 74 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(...)時會引發異常。

我怎樣才能捕捉到這個例外,以正確地向客戶展示它?

順便說一句,回調函數也被稱爲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有一個'method'類型的表單調用你指定的方法,但我沒有使用它。 – 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

相關問題