Javascript 使用Future正确处理异步调用的Meteor错误

Javascript 使用Future正确处理异步调用的Meteor错误,javascript,asynchronous,meteor,node-fibers,Javascript,Asynchronous,Meteor,Node Fibers,我想知道在使用异步方法时如何正确处理Meteor的错误。我尝试了以下操作,但是在客户端回调的result参数中返回了错误,而不是error参数 服务器代码: Future = Npm.require('fibers/future'); Meteor.methods({ 'myServerMethod': function(){ var future = new Future(); // URL to some remote API va

我想知道在使用异步方法时如何正确处理Meteor的错误。我尝试了以下操作,但是在客户端回调的result参数中返回了错误,而不是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.return(error);
                }
            }
        );

        return future.wait();
    }
});
客户端代码:

Meteor.call('myServerMethod', function (error, result) {
    if(error){
        console.warn(error);
    }

    console.log('result', result);
});
正如我上面所说的,当服务器端的HTTP.get()返回错误时,客户端事件中的“error”总是未定义的。我还尝试替换
future.return(错误)
future.throw(错误)在服务器端,但这确实会在服务器端引发错误。然后,客户端错误参数获取500服务器错误,尽管服务器上抛出的错误是401未经授权的错误


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

根据

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

这就是您在客户端上收到
500服务器错误的原因。如果要保留错误消息并将其发送到客户端,可以执行以下操作:

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);
        }
    }
});

根据Meteor.Error的
docs

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

这就是您在客户端上收到
500服务器错误的原因。如果要保留错误消息并将其发送到客户端,可以执行以下操作:

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);
        }
    }
});

不是解决方案而是澄清,
HTTP
调用可以在服务器端同步
var res=HTTP.get(url,{})
,还有很多其他用例需要在服务器端使用回调,我正在寻找一个好的答案,不是解决方案而是澄清,
HTTP
调用可以在服务器端同步
var res=HTTP.get(url,{})
,还有很多其他用例需要在服务器端使用回调,我正在寻找一个很好的答案,我不确定我是否了解try-catch在未来会做什么。wait()。。。此外,我倾向于避免在JS中使用try-catch块,因为它会阻止整个函数的优化(请参阅:)。我必须抛出一个错误吗?我只想向客户端报告一个错误。我觉得抛出有点苛刻。您可能可以用抛出新流星来替换
未来。抛出(错误)
。错误(…,…)
我不确定我是否了解未来的try-catch正在做什么。等等()。。。此外,我倾向于避免在JS中使用try-catch块,因为它会阻止整个函数的优化(请参阅:)。我必须抛出一个错误吗?我只想向客户端报告一个错误。我觉得抛出有点苛刻。你可以用抛出新流星(…,…)替换
future.throw(error)