node.js - 如何在json nodejs中保存带有请求的文件?

标签 node.js

我正在尝试将结果保存到 json 文件中,但是当我看到它减半时,我的代码中出现了错误,但我不明白您的部分,感谢您的帮助。

var request = require("request");
var cheerio = require("cheerio");
var fs = require('fs');
var urls = ["http://www.fordencuotas.com.ar"]

var req = function(url){
    request({
        uri: url,
    }, function(error, response, body) {
        var $ = cheerio.load(body);
        $("a").each(function() {
        var link = $(this);
        var itri = {iti: new Array(link.attr("href"))}
        var data = JSON.stringify(itri);
        fs.writeFile("file.json", data, function(err){
            if(err){console.log(err);} else {console.log("archivo guardado..");}
        });
        });
    });
}

for (var i = 0; i < urls.length; i++){
    req(urls[i]);
}

console.log("cargando...");

这个输出

[opmeitle@localhost crawler1]$ node crawmod.js
cargando...
archivo guardado..
archivo guardado..
archivo guardado..
archivo guardado..
archivo guardado..
...
archivo guardado..
[opmeitle@localhost crawler1]$ cat file.json
{"iti":["productos/autos/nuevo-focus.html"]}us.html"]}
[opmeitle@localhost crawler1]$ 

最佳答案

您的代码中存在一些问题。

首先,您尝试为每个 a 元素覆盖同一个文件 (file.json)。我不确定这是否是您的意图,但这似乎毫无意义。

其次,fs.writeFile 是异步的。这意味着 Node 不会等到文件写入后才返回循环。换句话说,对于每个 a 元素,您打开同一个文件,而它可能已被循环的早期迭代打开。每次迭代都会写入同一个文件,因此您最终会得到意想不到的结果。

您可以使用fs.writeFileSync同步写入文件,这将使 Node 等待数据写入文件后再继续,或者收集要保存到文件中的所有数据到变量中,以及 - 在 $("a ").each(...) 循环 — 将该变量写入文件一次。

最后一个解决方案可能如下所示:

var data = [];
$("a").each(function() { 
  var link = $(this);
  var itri = {iti: new Array(link.attr("href"))}
  data.push( itri );
});
fs.writeFile("file.json", JSON.stringify(data), function(err){
  if(err){console.log(err);} else {console.log("archivo guardado..");}
});

关于node.js - 如何在json nodejs中保存带有请求的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628575/

相关文章:

javascript - 请求nodejs模块不支持某些url的重定向

node.js - Webstorm,nodejs, npm test, '.' 不被识别为内部或外部命令,

node.js - Nodejs不保留请求 header 的大写

javascript - 在 JavaScript 中实现回调

javascript - NodeJS/MySQL 查询数据 url 中的引号

node.js - NodeJS - 为什么当前域在 Promise 中未定义?

angularjs - Angular没有显示响应数据

javascript - 如果存在则追加到列表或在 dynamoDB 中添加列表

javascript - Angular:在哪里安全地添加管理功能?

mysql - nodejs 返回错误响应