1

我想知道在使用异步方法时如何正确处理 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 服务器错误,尽管在服务器上抛出的错误是 401 未经授权的错误。

那么,是否可以正确使用 Fiber 的 Future 以便客户端回调接收与服务器回调相同的错误参数?

4

1 回答 1

4

根据http://docs.meteor.com/#/full/meteor_errorMeteor.Error上的文档

方法可以抛出任何类型的异常。但是 Meteor.Error 是服务器发送给客户端的唯一一种错误。如果一个方法函数抛出一个不同的异常,那么它将被映射到在线上的一个净化版本。具体来说,如果抛出错误的 sanitizedError 字段设置为 Meteor.Error,那么该错误将被发送到客户端。否则,如果没有可用的净化版本,客户端会收到 Meteor.Error(500, 'Internal server error')。

这就是为什么您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);
        }
    }
});
于 2015-08-14T19:02:52.790 回答