JSON.parse, неожиданный токен T в JSON в позиции 0 - PullRequest
0 голосов
/ 13 февраля 2019

Итак, у меня есть небольшая программа для веб-сокетов, которая извлекает данные с веб-сайта.Иногда он достигает максимум 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: Неожиданный токен T в JSON в позиции 0

в 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_readable.js: 1094: 12)

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 13 февраля 2019

Что происходит и почему

Когда вы достигаете предела скорости, установленного удаленным веб-сайтом, он возвращает строку "Слишком много запросов. Пожалуйста, повторите попытку позже."

Как вы могли бы сказать, это недопустимый 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);
});

Добавьте блок try-catch вокруг JSON.parse()

JSON.parse() - это функция, котораявернет объект JSON из String, если он правильно отформатирован, или выдаст ошибку в противном случае.

Поэтому рекомендуется обернуть его в блок 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);
    }
});
...