JSON.parse,位置 0 JSON 中的意外标记 T
JSON.parse, Unexpected token T in JSON at position 0
所以我有一个小的网络套接字程序可以从网站上提取数据。有时它会达到每秒最多 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;
} ...
输出错误是这样说的:
undefined:1
Too many requests. Please try again later.
SyntaxError: Unexpected token T in JSON at position 0
at JSON.parse ()
at Request.get [as _callback] (/home/pi/Desktop/BitBot/test.js:702:23)
at Request.self.callback (/home/pi/Desktop/BitBot/node_modules/request/request.js:185:22)
at Request.emit (events.js:182:13)
at Request. (/home/pi/Desktop/BitBot/node_modules/request/request.js:1161:10)
at Request.emit (events.js:182:13)
at IncomingMessage. (/home/pi/Desktop/BitBot/node_modules/request/request.js:1083:12)
at Object.onceWrapper (events.js:273:13)
at IncomingMessage.emit (events.js:187:15)
at endReadableNT (_stream_readable.js:1094:12)
有什么解决办法吗?
发生了什么以及为什么
当您达到远程网站设置的速率限制时,它return发送字符串“请求过多。请稍后再试。”
如您所知,这是无效的 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);
});
从那里,您甚至可以检查在“请求过多”响应时发送了哪个状态代码。假设它是 429,由 RFC 6585.
指定
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()
是一个函数,如果格式正确,它将 return 来自 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);
}
});
所以我有一个小的网络套接字程序可以从网站上提取数据。有时它会达到每秒最多 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;
} ...
输出错误是这样说的:
undefined:1
Too many requests. Please try again later.SyntaxError: Unexpected token T in JSON at position 0
at JSON.parse ()
at Request.get [as _callback] (/home/pi/Desktop/BitBot/test.js:702:23)
at Request.self.callback (/home/pi/Desktop/BitBot/node_modules/request/request.js:185:22)
at Request.emit (events.js:182:13) at Request. (/home/pi/Desktop/BitBot/node_modules/request/request.js:1161:10) at Request.emit (events.js:182:13) at IncomingMessage. (/home/pi/Desktop/BitBot/node_modules/request/request.js:1083:12) at Object.onceWrapper (events.js:273:13) at IncomingMessage.emit (events.js:187:15) at endReadableNT (_stream_readable.js:1094:12)
有什么解决办法吗?
发生了什么以及为什么
当您达到远程网站设置的速率限制时,它return发送字符串“请求过多。请稍后再试。”
如您所知,这是无效的 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);
});
从那里,您甚至可以检查在“请求过多”响应时发送了哪个状态代码。假设它是 429,由 RFC 6585.
指定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()
是一个函数,如果格式正确,它将 return 来自 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);
}
});