Javascript node.js如何使用fs获取收到的api结果

Javascript node.js如何使用fs获取收到的api结果,javascript,node.js,rest,Javascript,Node.js,Rest,我是node.js的新手。在这里,我试图用收到的resultresponse.body创建一个txt文件。但它只是打印了一个例外。 我需要你的帮助 function fetch(){ const got = require('got'); got('https://www.google.com', { json: true }).then(response => { console.log(response.body); temp = response.body;

我是node.js的新手。在这里,我试图用收到的resultresponse.body创建一个txt文件。但它只是打印了一个例外。 我需要你的帮助

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);
}
});
三个问题:

1-temp和response.body都在fetch函数内,因此不能在外部使用

2-您对异步操作的处理不正确。虽然setInterval将使提取延迟10秒,但对文本文件的写入仍将立即运行

3-在文件末尾使用异步文件写入方法。IIRC程序将在完成之前终止

一个简单的解决方案是在fetch之外创建一个变量来存储值,运行fetch,然后让写入操作延迟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!我从got中删除了选项{json:true},因为google.com似乎只能返回html。不确定这对你想做的事情是否重要

如果您不熟悉语法:

async-声明一个异步操作。它可以直接用作文件末尾的承诺,也可以用作可观察的承诺

wait-通知程序暂停代码执行,直到同一行上的异步操作解决为止。在这种情况下,操作将等待google.com的响应

writeFileSync-将其从write更改为确保处理器在终止前等待进程完成。这可能是必需的,也可能不是必需的,这取决于您在什么情况下运行此程序。

三个问题:

1-temp和response.body都在fetch函数内,因此不能在外部使用

2-您对异步操作的处理不正确。虽然setInterval将使提取延迟10秒,但对文本文件的写入仍将立即运行

3-在文件末尾使用异步文件写入方法。IIRC程序将在完成之前终止

一个简单的解决方案是在fetch之外创建一个变量来存储值,运行fetch,然后让写入操作延迟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!我从got中删除了选项{json:true},因为google.com似乎只能返回html。不确定这对你想做的事情是否重要

如果您不熟悉语法:

async-声明一个异步操作。它可以直接用作文件末尾的承诺,也可以用作可观察的承诺

wait-通知程序暂停代码执行,直到同一行上的异步操作解决为止。在这种情况下,操作将等待google.com的响应


在writeSync终止进程之前,请确保-writeSync将等待该进程完成。这可能是必需的,也可能不是必需的,这取决于您在什么情况下运行此程序。

由于您是nodeJS新手,您需要了解回调函数的概念。这里的“got”是一个回调函数。与其他类型的脚本不同,NodeJs不会等待fetch完成,而是向前移动并执行其余语句。您的代码有一些错误

变量“temp”、“response”的作用域-在执行fs.write时,response.body仍处于未定义和未声明状态。因为提取函数尚未执行

您发送了一个参数{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将在“get”函数通过返回响应变量完成其执行后执行。这里我还删除了参数{json:true},因为响应不是json格式。

由于您是nodeJS新手,您需要了解回调函数的概念。这里的“got”是一个回调函数。与其他类型的脚本不同,NodeJs不会等待fetch完成,而是向前移动并执行其余语句。您的代码有一些错误

变量“temp”、“response”的作用域-在执行fs.write时,response.body仍处于未定义和未声明状态。因为提取函数尚未执行

您发送了一个参数{json:true},该参数尝试以json格式获取响应。但是请求的URL使用普通文本文档/HTML文档进行答复。因此,删除该参数肯定会有所帮助。


此处,fs.write将在“get”函数通过返回响应变量完成其执行后执行。这里我还删除了参数{json:true},因为响应不是json格式。

任何时候你想说打印一个异常,你也应该粘贴该异常,并在代码中指出相关的行。@Amadan异常是什么非常清楚。response.body的作用域是get调用的.then。您无法在fs中访问它。write@Luca当前位置即使很清楚,这也是常见的礼貌。也许我困了,错过了显而易见的事情。也许不太清楚。人们应该尽可能多地提供诊断信息。不这样做无异于去医生办公室说“猜猜看!”!任何时候你想说打印一个异常,你也应该粘贴该异常,并在代码中指出相关的行。@Amadan异常是什么是非常清楚的。response.body的作用域是get调用的.then。您无法在fs中访问它。write@Luca当前位置即使很清楚,这也是常见的礼貌。也许我困了,错过了显而易见的事情。也许不太清楚。人们应该训练自己提供尽可能多的诊断信息。不这样做无异于去医生办公室说“猜猜看!”!虽然这个代码片段可以解决这个问题,但它没有解释为什么或者如何回答这个问题。请注意,这确实有助于提高你文章的质量。虽然这个代码片段可以解决这个问题,但它没有解释为什么或者如何回答这个问题。请,因为这确实有助于提高你的文章质量。