[英]Nodejs: How to handle http request throttle error using async/await?
我正在尝试构建一个搜索 API,它将位置作为参数并返回该位置的纬度和经度。 我正在使用http://geocode.xyz来获取位置的详细信息。 例如: https : //geocode.xyz/?locate=Warsaw,Poland&json=1这将返回该位置所需的纬度和经度。
这是我拥有的代码片段:
const url = 'https://geocode.xyz/?locate=Warsaw,Poland&json=1';
const getData = async url => {
try {
const response = await fetch(url);
const json = await response.json();
console.log(json);
} catch (error) {
console.log(error);
}
};
getData(url);
有了这个,这是我看到的错误:
node geocode.js
{success: false, error: { code: '006', message: 'Request Throttled.'}}
我猜这个错误是因为我需要限制访问 API https://geocode.xyz的请求数量。 我不确定如何在异步/等待中使用速率限制器。 任何帮助,将不胜感激。
编辑:根据下面的答案,我仍然看到“请求限制”
var request = require('request');
const fetch = require("node-fetch");
const requester = {
lastRequest: new Date(),
makeRequest: async function(url) {
// first check when last request was made
var timeSinceLast = (new Date()).getTime() - this.lastRequest.getTime();
if (timeSinceLast < 2000) {
this.lastRequest = new Date(this.lastRequest.getTime() + (2000 - timeSinceLast));
await new Promise(resolve => setTimeout(resolve, 2000-timeSinceLast));
// await new Promise(resolve => setTimeout(resolve, timeSinceLast));
}
const response = await fetch(url);
const json = await response.json();
return json;
}
};
requester.makeRequest('https://geocode.xyz/?locate=Warsaw,Poland&json=1')
.then(console.log)
我仍然遇到同样的错误:
{ success: false, error: { code: '006', message: 'Request Throttled.' } }
这是因为地理编码定价吗? 有没有办法限制用户端的请求率?
您可以创建一个用于发送所有请求的对象,并且该对象可以跟踪上次发出请求的时间。 例如
const requester = {
lastRequest: new Date(2000,0,1),
makeRequest: async function (url) {
// first check when last request was made
var timeSinceLast = (new Date()).getTime() - this.lastRequest.getTime();
this.lastRequest = new Date();
if (timeSinceLast < 1000) {
this.lastRequest = new Date(this.lastRequest.getTime() + (1000 - timeSinceLast));
await new Promise(resolve => setTimeout(resolve, 1000-timeSinceLast));
}
// make request here and return result
const response = await fetch(url);
const json = await response.json();
return json;
}
};
https://jsfiddle.net/3k7b0grd/
如果您使用requester.request
,它只允许您每秒发出一次请求,并等待足够长的时间(即使是连续请求)以遵守该速率限制
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.