Javascript 从Node.js向API发送多个请求会导致错误
我的数据库中有2000多个用户,当我尝试向所有用户广播一条消息时,它只发送了大约200个请求,然后我的服务器停止,我得到一个错误,如下所示: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
{ 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毫秒
您可以做的是:
系列
或并行限制
(使用回调)Promise.mapSeries
或Promise.map
和并发限制(使用promises)
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调用没有限制