Meteor服务端方法抛Meteor.Error,客户端无法在错误回调捕获
问题原因与修复方案
核心问题
服务端方法中,你捕获了Meteor.Error后直接将其作为返回值return,而非重新抛出。Meteor的方法调用机制是:只有当方法内主动抛出错误时,客户端的错误回调才会触发;如果把错误对象作为返回值返回,它会被当成正常的方法结果,传递到客户端的result参数中,这就是你看到错误出现在结果里的原因。
代码问题分析
你的服务端try/catch块中,catch分支的return error是错误操作。原本抛出的Meteor.Error被捕获后没有重新抛出,反而被当作正常结果返回给客户端,导致客户端的错误回调无法捕获它。
修复方案
方案1:移除不必要的try/catch
Meteor会自动捕获方法内部抛出的所有异常,并将其传递给客户端的错误回调,所以这里的try/catch完全是多余的。修改后的服务端代码:
Meteor.methods({ updateFtIndex: function (_id, index) { let isIndexExists = Meteor.users.findOne( {_id, "profile.featuredProviderIndex": index }, {fields: {"profile.featuredProviderIndex": 1}} ); if(isIndexExists){ console.log('isIndexExists: ', isIndexExists); throw new Meteor.Error(400, "Sorted index already exist !!!"); } else { console.log("else"); return Meteor.users.update( {_id}, { $set: { "profile.featuredProviderIndex": index } } ); } } })
方案2:保留try/catch但重新抛出错误
如果需要保留try/catch来处理其他类型的异常(比如数据库操作的非Meteor错误),需要在catch块中重新抛出Meteor.Error:
Meteor.methods({ updateFtIndex: function (_id, index) { try { let isIndexExists = Meteor.users.findOne( {_id, "profile.featuredProviderIndex": index }, {fields: {"profile.featuredProviderIndex": 1}} ); if(isIndexExists){ console.log('isIndexExists: ', isIndexExists); throw new Meteor.Error(400, "Sorted index already exist !!!"); } else { console.log("else"); return Meteor.users.update( {_id}, { $set: { "profile.featuredProviderIndex": index } } ); } } catch (error) { // 若是Meteor.Error直接重新抛出 if (error instanceof Meteor.Error) { throw error; } // 其他异常包装成Meteor.Error抛出,便于客户端处理 throw new Meteor.Error(500, "Server error occurred"); } } })
修复后,当服务端抛出Meteor.Error时,客户端的error参数会正确接收到这个错误,进入错误回调分支打印错误信息。
内容的提问来源于stack exchange,提问作者Srushti Shah
相关产品推荐
相关产品推荐

