Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs:如何使用async/await处理http请求限制错误?_Javascript_Node.js_Http_Async Await - Fatal编程技术网

Javascript Nodejs:如何使用async/await处理http请求限制错误?

Javascript Nodejs:如何使用async/await处理http请求限制错误?,javascript,node.js,http,async-await,Javascript,Node.js,Http,Async Await,我正在尝试构建一个搜索API,它将位置作为参数,并返回该位置的纬度和经度。 我正在使用它来获取位置的详细信息。 例如: 这将返回该位置所需的纬度和经度 这是我的代码片段: const url = 'https://geocode.xyz/?locate=Warsaw,Poland&json=1'; const getData = async url => { try { const response = await fetch(url); const json = awai

我正在尝试构建一个搜索API,它将位置作为参数,并返回该位置的纬度和经度。 我正在使用它来获取位置的详细信息。 例如: 这将返回该位置所需的纬度和经度

这是我的代码片段:

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的请求数量。我不知道如何将速率限制器与async/await一起使用。任何帮助都将不胜感激

编辑: 根据下面的答案,我仍然看到“请求限制”

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)

这是因为什么?有没有办法限制来自用户端的请求速率?

您可以创建一个用于发送所有请求的对象,该对象可以跟踪上一次发出请求的时间。比如说

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;
    }
};
const请求者={
最后请求:新日期(2000,0,1),
makeRequest:异步函数(url){
//第一次检查上次请求的时间
var timesineclast=(新日期()).getTime()-this.lastRequest.getTime();
this.lastRequest=新日期();
如果(时间间隔<1000){
this.lastRequest=新日期(this.lastRequest.getTime()+(1000-timeSinceLast));
等待新的承诺(resolve=>setTimeout(resolve,1000 timesincellast));
}
//在此处提出请求并返回结果
const response=等待获取(url);
const json=await response.json();
返回json;
}
};


如果您使用
requester.request
,它只允许您每秒发出一次请求,并等待足够长的时间(即使是连续的请求)以遵守该速率限制

您如何调用它以限制它?在一个循环中?API网站说免费使用是
(对于所有自由端口用户,限制为每秒不超过1个请求。例如,如果两个免费请求同时出现,每个请求将限制为每秒2秒)
。换句话说,除了支付服务费用之外,没有处理。@Phix:我没有使用循环。我有这个脚本,我正在以
节点geocode.js
@ChrisG的身份运行它:然后我可以对每秒发送1个请求的限制进行评级并处理它吗?不过您会如何使用这个对象?在搜索api中?
var requestResponse=await requester.makeRequest('url')
这是我尝试的
const requester={lastRequest:new Date(),makeRequest:async(url)=>{var timeSinceLast=(new Date()).getTime()-This.lastRequest.getTime();if(timeSinceLast<1000){wait new Promise(resolve=>setTimeout(resolve,timesincellast));}var requestResponse=wait requester.makeRequest('https://geocode.xyz/?locate=Warsaw,Poland&json=1')请求('https://geocode.xyz/?locate=Warsaw,Poland&json=1',函数(错误,响应,正文){console.log(响应)};}
在等待settimeout之后,只需执行您在OP中所做的操作,
const response=wait fetch(url);const json=wait response.json();return json;
。然后,您可以从应用程序中的任何其他位置调用
wait requester.makeRequest('url')
谢谢!尽管如此,我还是看到了错误
SyntaxError:await仅在异步函数中有效,当我在任何地方调用它时。是否需要
await
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;
    }
};