JSON.parse,JSON在位置0处出现意外的T令牌

4

我有一个小型的 Web Socket 程序,可以从网站中提取数据。有时,它达到每秒 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
请求太多。请稍后再试。

SyntaxError: JSON 中的意外字符 T,位置为 0

在 JSON.parse () 时
在 Request.get [as _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) 时 在 Request. (/home/pi/Desktop/BitBot/node_modules/request/request.js:1161:10) 时 在 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_readable.js:1094:12) 时

有什么想法可以解决这个问题吗?

您正在解析一个不是JSON格式的正文字符串,请在try/catch中包装解析,并执行类似if(error) => bad response的操作。 - Manuel Spigolon
使用try/catch语句来捕获错误。 - Paul
1个回答

4

发生了什么以及为什么

当您达到远程网站设置的速率限制时,它将返回字符串"Too many requests. Please try again later."

您可以看出,这不是有效的 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()是一个函数,如果字符串格式正确,则返回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);
    }
});

嗯,有点能用,但现在我遇到了这个错误: /home/pi/Desktop/BitBot/test.js:697 return console.log(response.statusCode+" "+response.body); ^TypeError: Cannot read property 'statusCode' of undefined at Request.get [as _callback] (/home/pi/Desktop/BitBot/test.js:697:34) at self.callback... - quo91
如果你调用了 (error, response, body),但没有内部的 error,那么很可能你在某个地方打错了拼写,必须有一个 response.statusCode - Azami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接