2017-07-04 54 views
0

我的数据库中有超过2000个用户,当我尝试向所有用户广播一条消息时,它几乎没有发送大约200个请求,然后我的服务器停止,我得到一个如下错误:从Node.js发送多个请求到一个API会导致错误

{ Error: connect ETIMEDOUT 31.13.88.4:443 
at Object.exports._errnoException (util.js:1026:11) 
at exports._exceptionWithHostPort (util.js:1049:20) 
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14) 
code: 'ETIMEDOUT', 
errno: 'ETIMEDOUT', 
syscall: 'connect, 
address: '31.13.88.4', 
port: 443 } 

有时候我得到另一个错误,说:

Error!: Error: socket hang up 

这是我的要求:

function callSendAPI(messageData) { 
    request({ 
    uri: 'https://graph.facebook.com/v2.6/me/messages', 
    qs: { access_token: '#####' }, 
    method: 'POST', 
    json: messageData 

    }, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     var recipientId = body.recipient_id; 
     var messageId = body.message_id; 

     if (messageId) { 
     console.log("Successfully sent message with id %s to recipient %s", 
      messageId, recipientId); 
     } else { 
     console.log("Successfully called Send API for recipient %s", 
     recipientId); 
     } 
    } else { 
     console.error("Failed calling Send API"); 
     console.log(error) 
    } 
    }); 
} 

我已经试过

setTimeout做出了一会儿的API调用wait:

setTimeout(function(){callSendAPI(data)},200); 

谁能帮助他/她面临着类似的错误?

我使用Messenger平台支持呼叫发送API率高并且不与200个呼叫限制编辑。

+0

请首先搜索谷歌搜索错误:https://www.google.com/search?q=ETIMEDOUT+node.js – mplungjan

+1

@mplungjan我做了,但我还没有找到与http.request相关的答案 –

+0

q = ETIMEDOUT + node.js + POST + facebook – mplungjan

回答

-1

这听起来像是你正在达到费率限制。

Facebook documentation

您的应用程序可以使每小时每用户200元话费合计。

您可以检查dashboard,看看您是否在这些情况下达到了限速。

+0

感谢您的评论,Messenger平台支持发送API的高速率,它没有限制 https://developers.facebook.com/docs/messenger-platform/send-api-reference –

1

您可能会遇到Facebook API限制。为了限制这些请求,你应该在前一个间隔后发送每个请求。你没有包括你迭代所有用户的位置,但是我怀疑你可能会在循环中执行它,如果你使用setTimeout延迟每个请求延迟200毫秒,那么你所有的请求都会像你一样同时完成之前 - 仅仅200毫秒后。

你可以做的是:

  1. 您可以使用setTimeout和添加可变延迟为每个请求(不推荐)
  2. 您可以使用异步模块的seriesparallelLimit(使用回调)
  3. 你可以使用蓝鸟的Promise.mapSeriesPromise.mapconcurrency限制(使用承诺)

1是不建议这样做,因为它仍然会被忽略(除非增加更多复杂性),并且仍然存在并发性过高和超出限制的风险,因为您只能控制请求何时开始,而不是控制多少未完成请求在那儿。

2和3大多相同,但通过使用回调或承诺有所不同。在你的例子中,你使用的是回调函数,但你的callSendAPI没有采用它自己的回调函数,如果你想让选项2工作,或者如果你想让选项3工作,它会返回一个承诺。

欲了解更多信息请参阅文档:

当然也有更多的方式来做到这一点,但这些都是最直截了当。

理想情况下,如果您想充分利用每小时200个请求的限制,那么您应该自己排列请求,并按照与该限制相对应的特定间隔发出请求。有时候,如果你在一个小时内没有做很多请求,那么你不需要延迟,有时候你会。你应该真正在这里做的是集中排队所有的请求,并以相应于已经用完的部分清空队列到你应该跟踪的限制 - 但这可能会非常棘手。

+0

感谢您的支持评论,Messenger平台支持高速率的发送API调用它没有限制 https://developers.facebook.com/docs/messenger-platform/send-api-reference 我不直接调用图形API,我打电话给messenger API,它对api调用没有限制 –

相关问题