[英]Throwing Meteor.Error does not reach the client
因此,基本上,客戶端使用Meteor.call
調用服務器。 然后,服務器方法進行一些驗證,並使用流星程序包調用Web服務。 如果驗證失敗並引發流星錯誤,它將到達服務器。 如果程序包響應有錯誤,則僅登錄服務器。 我需要錯誤才能到達客戶。
代碼如下所示。
客戶
Meteor.call('callService', (err, result) => {
if(err) {
console.log(err.reason);
}
});
服務器
Meteor.methods({
'callService'(){
if (!Meteor.user()) {
// Error 1
throw new Meteor.Error('insufficient-permissions', 'You need to login first');
}
// Using an meteor package to actually call the service
package.callService(apiKey, (err, response) => {
if (response.status === 'error') {
// Error 2
throw new Meteor.Error('service-error', response.message);
}
});
},
});
在服務器方法中,如果在錯誤1處引發錯誤 ,則錯誤確實會到達客戶端,而錯誤2不會。 錯誤2僅在服務器上登錄。
我猜你的package.callService()
是異步的(假設它接受了回調)。
在這種情況下,您的Meteor方法將啟動async任務,然后繼續其過程並返回(因為沒有更多指令),而async任務仍在運行(實際上正在等待遠程Web服務的響應)。 因此,您的客戶端Meteor呼叫的回調將收到“無錯誤”響應。
一旦發生“錯誤2”,流星調用就已經完成,並且該錯誤只能記錄在服務器上。
如果要“掛斷”您的方法,以便它等待package.callService()
的結果以確定它是成功還是錯誤並相應地完成Meteor調用,則可以嘗試使用Meteor.wrapAsync()
。
順便說一句,如果您確實使用同步任務來實際等待遠程服務,您可能會對this.unblock()
感興趣,以允許您的服務器處理其他任務(方法),而不僅僅是空轉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.