因此,我有一个小的Web套接字程序,可从网站提取数据。有时,它每秒达到最多6个查询,并且当它崩溃时。我放了一条if语句来检查是否收到了请求,但它似乎不起作用。造成所有混乱的代码部分是这样的:
Request.get(url, (error, response, body) => {
if(error) {
var flag = 1;
return console.dir(error);
}
if(flag == 1)
{
return;
}
var object = JSON.parse(body); <-- error points here
if(!object || !object.data || !object.data.items || typeof object.data.items[0] === 'undefined')
{
return;
} ...
输出错误说明:
未定义:1
请求太多。请稍后再试。SyntaxError:JSON中位置0的意外令牌T
at JSON.parse()
在Request.get [作为_callback](/home/pi/Desktop/BitBot/test.js:702:23)
在Request.self.callback(/home/pi/Desktop/BitBot/node_modules/request/request.js:185:22)
在Request.emit(events.js:182:13) 应要求。 (/home/pi/Desktop/BitBot/node_modules/request/request.js:1161:10) 在Request.emit(events.js:182:13) 在IncomingMessage。 (/home/pi/Desktop/BitBot/node_modules/request/request.js:1083:12) 在Object.onceWrapper(events.js:273:13) 在IncomingMessage.emit(events.js:187:15) 在endReadableNT(_stream_visible.js:1094:12)
有什么办法解决这个问题吗?
答案 0 :(得分:1)
达到远程网站设置的速率限制时,它将返回字符串“请求过多。请稍后重试。”
如您所知,这不是有效的JSON。如果您尝试JSON.parse()
该字符串,则会引发错误。
let str = "Too many requests. Please try again later.";
console.log(JSON.parse(str));
相反,您应该做两件事:
response.statusCode
首先,检查成功请求后发送的状态码。假设它是200。然后可以添加一个块来处理不同于200的状态代码:
Request.get(url, (error, response, body) => {
if(error) {
return console.dir(error);
}
if(response.statusCode != 200){ //200 is the status code on successful requests in this case
return console.log(response.statusCode+" "+response.body);
}
var object = JSON.parse(body);
});
从那里,您甚至可以检查在“请求过多”响应中发送了哪个状态代码。假设它是RFC 6585指定的429。
Request.get(url, (error, response, body) => {
if(error) {
return console.dir(error);
}
if(response.statusCode != 200){
if(response.statusCode == 429)
return console.log("429 Too many requests"); //429 error
else
return console.log(response.statusCode+" "+response.body); //some other status code that isn't '200 OK'
}
var object = JSON.parse(body);
});
JSON.parse()
周围添加一个try-catch块 JSON.parse()
是一个函数,如果格式正确,它将从String返回JSON对象,否则将引发错误。
因此,如果字符串来自另一个网站,则最好将其包装在try-catch块中,因为您无法确定在100%的情况下字符串的格式是否正确。
对我来说,您的最终代码及其错误处理最终将如下所示:
Request.get(url, (error, response, body) => {
if(error) {
return console.dir(error);
}
if(response.statusCode != 200){
if(response.statusCode == 429)
return console.log("429 Too many requests");
else
return console.log(response.statusCode+" "+response.body);
}
var object;
try{
object = JSON.parse(body);
}catch(err){
console.log("Error on parsing string", err);
}
});