node.js как использовать fs для полученного результата API - PullRequest
0 голосов
/ 29 августа 2018

Я новичок в node.js. здесь я пытаюсь создать текстовый файл с моим полученным результатом (response.body). но это просто печатает исключение. нужна твоя помощь.

function fetch(){

const got = require('got');

got('https://www.google.com', { json: true }).then(response => {

    console.log(response.body);
    temp = response.body;

}).catch(error => {
    console.log(error.response.body);
});
};


setInterval(fetch, 10000);

const fs = require('fs');
fs.write('demo3.txt', response.body, { flag: "a"}, function(err){

if(err){
    return console.log(err);
}
});

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Три проблемы:

1 - temp и response.body находятся в пределах вашей функции fetch () и поэтому не могут использоваться снаружи.

2 - ваша обработка асинхронных операций неверна. Хотя setInterval будет задерживать выборку на 10 секунд, запись в текстовый файл все равно будет выполняться немедленно.

3 - вы используете метод записи асинхронного файла в конце файла. IIRC программа прекратит работу до того, как завершится.

Наивным решением было бы создать переменную вне выборки для хранения значения, запустить выборку, а затем задержать операцию записи на 10 секунд.

Однако не рекомендуется ждать произвольное количество времени для завершения асинхронной операции, прежде чем продолжить.

Если вы хотите использовать ES2017 / ES8, я предлагаю следующий код:

const got = require('got');
const fs = require('fs');

async function fetch() {
  const response = await got('https://www.google.com');
  return response.body;
};

fetch().then(body => fs.writeFileSync('./demo3.txt', body));

(PS! Я удалил опцию {json: true} из got, поскольку google.com, похоже, возвращает html, насколько я могу судить. Не уверен, важно ли это для всего, что вы пытаетесь сделать.)

Если вы не знакомы с синтаксисом:

async - объявляет асинхронную операцию. Использовать его как Promise (как сделано в конце файла) или Observable просто.

await - указывает программе прекратить выполнение кода до тех пор, пока не прекратится асинхронная операция в той же строке. В этом случае операция ожидает ответа от google.com

writeFileSync - изменено это значение с записи, чтобы убедиться, что процессор ожидает завершения процесса перед завершением. Это может или не может быть необходимым в зависимости от того, при каких обстоятельствах вы запускаете эту программу.

0 голосов
/ 29 августа 2018

Поскольку вы новичок в nodeJS, вам необходимо знать принципы функций обратного вызова. Здесь 'got' является функцией обратного вызова. В отличие от других типов сценариев, NodeJ не будут ждать завершения выборки, а будут двигаться вперед и выполнять оставшиеся операторы. В вашем коде есть несколько ошибок.

  1. Определение переменных 'temp', 'response'. - Во время выполнения fs.write, response.body остается неопределенным и необъявленным. Поскольку функция выборки еще не выполнена.

  2. Вы отправили параметр {json: true}, этот параметр пытается получить ответ в формате JSON. Но запрошенный URL отвечает обычным текстовым документом / документом HTML. Поэтому удаление этого параметра наверняка поможет.

    const fs = require('fs');
    const got = require('got');
    
    function fetch(){
        got('https://www.google.com' ).then(response => {
        console.log("Response");
        temp = response.body;
        fs.writeFile('demo3.txt', temp  , { flag: "a"}, function(err){
            if(err){
                return console.log(err);
            }
            });
            }).catch(error => {
            console.log(error);
        });
    };
    
    fetch();  
    

Здесь fs.write будет выполняться после того, как функция 'got' завершит свое выполнение, вернув переменную response. Здесь я также удалил параметр {json: true}, так как ответ не в формате JSON.

0 голосов
/ 29 августа 2018
function fetch(){
   var fs = require('fs');
   var got = require('got');

    got('https://www.google.com', { json: true }).then(response => {

    console.log(response.body);
    temp = response.body;
     fs.writeFile("/tmp/test",temp, function(err) {
        if(err) {
            return console.log(err);
        }
        console.log("The file was saved!");
    });

    }).catch(error => {
       console.log(error.response.body);
    });
};    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...