Неожиданная ошибка конца ввода JSON после ожидающего обещания - PullRequest
0 голосов
/ 11 октября 2019

Я нахожусь в процессе создания обработчика данных, и как часть этого мне нужно загрузить файл, чтобы затем проанализировать и работать с ним как с частью обработчика.

Я завернул запрос на файлв обещании и асинхронном вызове метода из других методов

Я включил обработчик из отдельного файла теста следующим образом

let DataHandler = require('./handler');

const handler = new DataHandler();

console.log(handler.getSupervisors());

Метод getSupervisors выглядит следующим образом

async getSupervisors() {
    const parsed = await this.loadFile();
    let supervisorList = [];

    parsed.controllers.map(controller => {
        if (controller.rating === 11 || controller.rating === 12){
            supervisorList.push(controller);
        }
    });

    return supervisorList;
}

Это вызывает метод loadFile, который просто вызывает метод update и перед возвратом необходимого файла json. Следующие 2 метода - это update и downloadFile, которые, как я думаю, являются моими двумя проблемами, они заключаются в следующем:

async update() {    
    let body = await this.downloadFile();
    const parsedJSON = JSON.parse(body);

    parsedJSON.updated_date = new Date();
    const json = JSON.stringify(parsedJSON);
    fs.writeFile('vatsimData.json', json, function(err, result) {
        if(err) console.log(err);
    });
}

downloadFile() {
    return new Promise((resolve, reject) => {
        const urlList = [
            'http://us.data.vatsim.net/vatsim-data.json',
            'http://eu.data.vatsim.net/vatsim-data.json',
            'http://apac.data.vatsim.net/vatsim-data.json'
        ];
        const url = urlList[Math.floor(Math.random()*urlList.length)];
        request(url, (error, response, body) => {
            if (error) reject(error);

            if (response.statusCode !== 200) {
                reject('Invalid status code <' + response.statusCode + '>');
            }

            resolve(body);
        });
    });
}

Вывод метода getSupervisors должен представлять собой массив всех супервизоров'внутри файла json вместо этого он возвращает Promise { <pending> } и эту ошибку

(node:3160) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at DataHandler.loadFile (D:\Projects\VATSIM-Data-Handler\handler.js:57:15)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:3160) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:3160) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я попытался поместить весь метод update в .then обратный вызов после вызова downloadFile, но он сделалне работает

Мой метод loadFile выглядит следующим образом

async loadFile(){
    await this.update();
    return(JSON.parse(fs.readFileSync('vatsimData.json', {encoding:'utf-8'})));
}

1 Ответ

1 голос
/ 11 октября 2019

Причина, по которой вы получаете обещание, заключается в том, что вы не await используете функцию async, когда console.log(handler.getSupervisors());

вы должны сделать

handler.getSupervisors.then(val => console.log(val));

Ошибкавозможно, потому что ответ body от сервера может быть искажен. попробуйте console.log body перед вызовом JSON.parse() и используйте try catch для переноса и предотвращения необработанных ошибок

Обновление Из комментариев вы пытаетесь проанализировать прочитанный файл с неверной кодировкой

console.log(JSON.parse(fs.readFileSync('vatsimData.json',{encoding:'utf-8'})));

Добавить значение кодировки в опциях.

Обновить

async update() {    
    let body = await this.downloadFile();
    const parsedJSON = JSON.parse(body);

    parsedJSON.updated_date = new Date();
    const json = JSON.stringify(parsedJSON);
    fs.writeFileSync('vatsimData.json', json, function(err, result) {
        if(err) console.log(err);
    }); // convert it to sync or resolve with a new promise when you complete the write to wait for the loadFile to have the file ready
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...