node.js - JSON.parse,JSON 中位置 0 处出现意外标记 T

标签 node.js json request undefined

所以我有一个小的网络套接字程序,可以从网站提取数据。有时它会达到每秒最多 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)

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

最佳答案

发生了什么以及为什么

当您达到远程网站设置的速率限制时,它会返回字符串“请求过多。请稍后再试。”

正如您所知,这不是有效的 JSON。如果您尝试 JSON.parse() 这个字符串,您将抛出一个错误。

let str = "Too many requests. Please try again later.";

console.log(JSON.parse(str));

相反,您应该做两件事:

读取response.statusCode

首先,检查成功请求时发送的状态代码。假设它是 200。然后您可以添加一个 block 来处理与 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 block

JSON.parse() 是一个函数,如果格式正确,它将从字符串返回 JSON 对象,否则抛出错误。

因此,如果字符串来自另一个网站,最好将其包装在 try-catch block 中,因为您无法判断该字符串在 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);
    }
});

关于node.js - JSON.parse,JSON 中位置 0 处出现意外标记 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54674091/

相关文章:

javascript - 是否有一个 npm 模块来修改 node.js 中的 pdf 文件?

javascript - 如何将javascript变量值传递给django中的views.py函数?

php - 使用 PHP 进行 JSON 模式验证

javascript - express 收到的 json 不是我发送的

node.js - 如何使用 Node.js 和 Request 库将文件附加到 Mailgun 的 API 的 POST 请求

node.js - 使用 Sharp 进行 SVG 多行文本换行

javascript - 记录 Mongoose 创建的对象的值时未反射(reflect)值属性更改

node.js - Namecheap、Node 和 Heroku 上的 SSL

json - grails 中 hasMany 关系的选择性深度渲染