javascript - Meteor HTTP.get 错误处理

标签 javascript html meteor http-get

我正在尝试使用 futures 对一组 URL 异步执行 HTTP.get。

meteor 版本: 0.8.3 平台:Windows server 2012

代码有点像这样:

var futures = _.map(test, function(url) {

 var future = new Future();
 var onComplete = future.resolver();

 try{
    // Make async http call
    var httpGet = HTTP.get(url,{followRedirects: true},function(error, result) {
        if(error)
        {
            apiLogger.error("%s is error",error);
            onComplete(error, null);
        }
        else
        {
            if(result!=null){
                //operations done here  
                onComplete(error, JSON.stringify(object1));                 
            }
            else {
                apiLogger.error('%s - User encountered an error. URL not parsed: %s',user,url);
                onComplete(error, null);
            }
        }
    });
 }
 catch(e)
 {
    apiLogger.error('%s - URsarsed: %s - %s',user,url,result.statusCode);
    onComplete(error, null);
 } 
 return future;
});

我面临的问题是错误处理不当。

我在某些 URL 上收到以下错误:

I20140904-17:57:38.609(-4)? Exception while invoking method 'parallelAsyncJob' E
rror: failed [404] <html><head><title>Apache Tomcat/7.0.12 - Error report</title
><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color
:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;ba
ckground-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;
color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,A
rial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial
,sans-serif;color:white;background-colo...
I20140904-17:57:38.617(-4)?     at packages/underscore/underscore.js:255
I20140904-17:57:38.619(-4)?     at Array.map (native)
I20140904-17:57:38.621(-4)?     at Function._.map._.collect (packages/underscore
/underscore.js:123)
I20140904-17:57:38.623(-4)?     at Function._.invoke (packages/underscore/unders
core.js:254)
I20140904-17:57:38.626(-4)?     at Meteor.methods.parallelAsyncJob (app/server/m
ethods.js:1:9355)
I20140904-17:57:38.628(-4)?     at maybeAuditArgumentChecks (packages/livedata/l
ivedata_server.js:1488)
I20140904-17:57:38.631(-4)?     at packages/livedata/livedata_server.js:650
I20140904-17:57:38.632(-4)?     at _.extend.withValue (packages/meteor/dynamics_
nodejs.js:37)
I20140904-17:57:38.635(-4)?     at packages/livedata/livedata_server.js:649
I20140904-17:57:38.644(-4)?     at _.extend.withValue (packages/meteor/dynamics_
nodejs.js:37)
I20140904-17:57:38.646(-4)?     - - - - -
I20140904-17:57:38.648(-4)?     at makeErrorByStatus (packages/http/httpcall_com
mon.js:12)
I20140904-17:57:38.650(-4)?     at Request._callback (packages/http/httpcall_ser
ver.js:99)
I20140904-17:57:38.652(-4)?     at Request.self.callback (C:\Users\Administrator
\AppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.js:122:
22)
I20140904-17:57:38.655(-4)?     at Request.EventEmitter.emit (events.js:98:17)
I20140904-17:57:38.657(-4)?     at Request.<anonymous> (C:\Users\Administrator\A
ppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.js:888:14
)
I20140904-17:57:38.660(-4)?     at Request.EventEmitter.emit (events.js:117:20)
I20140904-17:57:38.662(-4)?     at IncomingMessage.<anonymous> (C:\Users\Adminis
trator\AppData\Local\.meteor\tools\edf8981bb6\lib\node_modules\request\request.j
s:839:12)
I20140904-17:57:38.665(-4)?     at IncomingMessage.EventEmitter.emit (events.js:
117:20)
I20140904-17:57:38.668(-4)?     at _stream_readable.js:920:16
I20140904-17:57:38.669(-4)?     at process._tickCallback (node.js:415:13)

我做错了什么吗?还是 GET 问题?

更新:

  1. 我使用的是futures,因为最后的操作只能在获取到所有的url之后进行。

  2. 有趣的是,我能够通过浏览器打开 URL,甚至是 POSTMAN 并获得 200 状态。但是 meteor get 收到 404。

最佳答案

根据您的错误消息,您收到了 404 错误代码;您的某些网址无效。你自己说它只发生在某些 URL 上。

为什么你的代码这么复杂,有那么多 futures? HTTP.get() itself offers an asyncCallback ,并且您已经在代码中使用了内联回调,那么为什么不去掉所有 futures 的东西呢?

_.map(test, function(url) {
  try {
    // Make async http call
    HTTP.get(url, {followRedirects: true}, function(error, result) {
      if (error) {
        if (result.statusCode == 404)
          apiLogger.error('Error 404, URL not found: %s', url);
        else
          apiLogger.error('Error %s from %s for user %s',
            result.statusCode, url, user);
        return false;
      } else {
        if (result != null) {
          // operations done here  
        } else {
          apiLogger.error('Empty or invalid result returned from %s for user %s',
            url, user);
        }
        return false;
      }
    });
  } catch (error) {
    return false;
  }
});

关于javascript - Meteor HTTP.get 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675934/

相关文章:

javascript - 使用 jQuery 打开点击的元素并关闭任何其他打开的元素

javascript - React.cloneElement/HOC/嵌入

php - 错误的整数值 : '' for column 'user_id' at row 1

javascript - 这是 block 声明中的计算方法名称 - 还是拼写错误?

每秒重绘 meteor 时钟

javascript - 发布用户数据,用于个人资料页面

javascript - 从 Microsoft graph 获取所有用户属性

html - 为什么父高度与内部图像高度不同?

javascript - 如何将 div 和该 div 内的所有内容(图像、文本)设置为当前大小的百分比?

javascript - 带有不可编辑子项的 contentEditable div