Javascript 从Node.js向API发送多个请求会导致错误

Javascript 从Node.js向API发送多个请求会导致错误,javascript,node.js,facebook,api,node-request,Javascript,Node.js,Facebook,Api,Node Request,我的数据库中有2000多个用户,当我尝试向所有用户广播一条消息时,它只发送了大约200个请求,然后我的服务器停止,我得到一个错误,如下所示: { 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 [a

我的数据库中有2000多个用户,当我尝试向所有用户广播一条消息时,它只发送了大约200个请求,然后我的服务器停止,我得到一个错误,如下所示:

{ 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调用等待一段时间:

 setTimeout(function(){callSendAPI(data)},200);
如果他/她遇到类似的错误,有人能帮忙吗

已编辑


我正在使用Messenger平台,它支持对Send API的高调用率,并且不限于200次调用

听起来你好像达到了利率上限

从:

你的应用程序每小时可以为每个用户总共拨打200个电话


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

您可能达到了Facebook API限制。要限制请求,您应该在前一个请求的间隔后发送每个请求。您没有包括迭代所有用户的位置,但我怀疑您可能是在循环中完成的,如果您使用
setTimeout
以200毫秒的平均延迟延迟每个请求,那么您就可以像以前一样在同一时间完成所有请求,只需200毫秒

您可以做的是:

  • 您可以使用setTimeout并为每个请求添加可变延迟(不推荐)
  • 您可以使用异步模块的
    系列
    并行限制
    (使用回调)
  • 您可以使用Bluebird的
    Promise.mapSeries
    Promise.map
    并发限制(使用promises)
  • 不建议使用1,因为它仍然是fire-and-forget(除非您增加了更多的复杂性),而且您仍然有可能拥有过多的并发性并超出限制,因为您只控制请求启动的时间,而不控制有多少未完成的请求

    2和3基本相同,但使用回调或承诺不同。在您的示例中,您正在使用回调,但如果您希望选项2起作用,您的
    callSendAPI
    不接受它自己的回调,或者,如果您希望选项3起作用,它应该返回一个承诺

    有关更多信息,请参阅文档:

    当然,有更多的方法可以做到这一点,但这些是最直接的


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

    @mplungjan I,但是我还没有找到一个与http.requestq=ETIMEDOUT+node.js+POST+facebook相关的答案。你是否同时向graph.facebook.com发出2000个请求,并想知道为什么会失败?:)@杰里米希尔,对不起!提出2000年申请有什么问题?我没有直接使用graph.API。。我通过图表使用Messenger API,它没有限制。哦,如果是Messenger API,那就不同了。谢谢你的评论,Messenger平台支持对Send API的高调用率。它没有限制。谢谢你的评论,Messenger平台支持对Send API的高调用率。它没有限制。我不直接调用graph API,我调用Messenger API,它对API调用没有限制