解析json并写入文件

时间:2015-11-11 08:55:45

标签: javascript json node.js electron

我面临着一个奇怪的问题(至少对我而言)。我试图获取(通过wget下载)一个json文件,解析它并提取一些内容(图片网址)。然后将该内容存储在保存在txt文件中的数组中。最后,我再次使用wget下载图片网址列表。

我在这个应用程序中使用Electron.io。 Ajax函数可以执行此nodejs函数:

expressApp.get('/update', function(req, res) {
var util = require('util'),
    exec = require('child_process').exec,
    child, url1 = 'http://xxxxxx/api/product/';

exec = require('child_process').exec,
    child, url2 = 'http://xxxxxx/api/image/';

child = exec('wget ' + url1 + ' -O update.json',

    function(error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        console.log('Content updated!')
        if (error !== null) {
            console.log('exec error: ' + error);
        }
    });

child = exec('wget ' + url2 + ' -O image.json',

    function(error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        console.log('Image.json downloaded!')
        if (error !== null) {
            console.log('exec error: ' + error);
        }

    });

var file = __dirname + '/image.json';
var file_updated = __dirname + '/image_name.txt';

fs.readFile(file, 'utf8', function(err, data) {
    if (err) {
        console.log('Error: ' + err);
        return;
    }

    data = JSON.parse(data);

    var arr = data.objects.map(function(item) {
        return item.image;
    })

    var arr_updated = arr.toString();

    // console.log(arr);

    fs.writeFile(file_updated, '', function() {
        fs.writeFile(file_updated, arr_updated, function(err) {
            if (err) return console.log(err);
            console.log('List of image url added!');

            fs.readFile(file_updated, 'utf-8', function(err, data) {
                if (err) {
                    return console.log(err);
                }
                var result = data.replace(/,/g, '\n');

                fs.writeFile(file_updated, result, 'utf8', function(err) {
                    if (err) return console.log(err);
                });
            });
        });
    })
});

// child = exec('wget -i ' + file_updated + ' -P images', {maxBuffer: 1024 * 100000},

//   function (error, stdout, stderr) {
//     console.log('stdout: ' + stdout);
//     console.log('stderr: ' + stderr);
//     console.log('Images downloaded!')
//     if (error !== null) {
//       console.log('exec error: ' + error);
//     }

//   });

});

我的问题是,当我执行一次这个脚本时,image_text.txt没有更新,当我再次执行它时会更新..我试着理解为什么但不知道...... 如果有人可以帮助我。

提前感谢。

1 个答案:

答案 0 :(得分:1)

您的所有功能都是异步的。这意味着,您需要等待完成上一个功能才能运行下一个功能

所以你的代码看起来应该是这样的

child = exec('wget ' + url1 + ' -O update.json',

    function(error, stdout, stderr) {
        // ...
        child = exec('wget ' + url2 + ' -O image.json',

            function(error, stdout, stderr) {
                //...

            }
        )
    }
)

等等。您需要先下载文件,然后才能处理它们。 exec进程完成后,wget会触发回调

为了处理回调地狱,你可以使用https://github.com/caolan/async