2017-05-07 98 views
-1

我正在製作一個程序,通過讀取包含數百個鏈接的數組,讀取每個數據並擦除一些文本,然後將其作爲json輸出到輸出文件中。Nodejs json文件寫入

我無法格式化JSON文件,因爲.map()返回JSON對象是這樣的:

{ 
    "id": "wajnh3ivnydeegrr", 
    "lorem ipsum" 
},{ 
    "id": "6yuyz57cmrgo5fbe", 
    "message": "lorem ipsum" 
}, 

而不是一個JSON數組是這樣的:

[{ 
    "id": "wajnh3ivnydeegrr", 
    "lorem ipsum" 
},{ 
    "id": "6yuyz57cmrgo5fbe", 
    "message": "lorem ipsum" 
}] 

我怎麼可以把每個JSON對象進入陣列時格式正確? (最後的逗號將不得不被排除在外)。非常感謝您的幫助!完整的請求如下。完整的代碼可在Github here中找到。

app.get('/scrape', function(req, res) {  

    dataDocument.map(function(item, err) { 

    request(item, function(err, response, html) { 
     if (!err) { 

      //Variables 
      var message, id, date; 
      var $ = cheerio.load(html); 
      var message = $(".messagebody").text().trim(); 

      //Get Id 
      item = item.split('/'); 
      id = item[4]; 

      //Make json entry 
      var json = { 
       "id": id, 
       "message": message, 
       "date": date 
      }; 

      json.id = id; 
      json.message = message; 

      string = JSON.stringify(json, null, 4, function(json) { 

       console.log('Successfully written ' + json.id); 

      }); 

      fs.appendFile('./output', string + ',', function(){ 

      }); 

     } 
    }); 
}); 
+0

注:data.Document是包含列表導出的陣列。 – agomez

+0

建立一個數組並寫入一次? –

回答

1

您需要訂購您的請求,並知道你的第一個和最後一個要求,所以我們可以用承諾或簡單的NodeJS LIB稱爲async有一個叫做async.series功能和使用Array.prototype.map()來創建數組稱爲tasks這將有系列功能。 所有功能將按照您的dataDocument陣列的相同順序執行。

要安裝async

npm install --save async 

然後使用以下修改的碼

var async = require('async'); 

app.get('/scrape', function(req, res) { 
    var tasks = dataDocument.map(function(item, index) { // create a series of functions to be executed in order 
     return function(cb){ 
      request(item, function(err, response, html) { 
       if (!err) { 
        //Variables 
        var message, id, date , string ; 
        var $ = cheerio.load(html); 
        message = $(".messagebody").text().trim(); 
        //Get Id 
        item = item.split('/'); 
        id = item[4]; 
        //Make json entry 
        var json = { 
         "id": id, 
         "message": message, 
         "date": date 
        }; 
        string = JSON.stringify(json, null, 4, function(json) { 
         console.log('Successfully written ' + json.id); 
        }); 
        var output = string + ','; 
        if(index === 0){ 
         output = '[' + string + ','; // first item 
        } 
        if(index === dataDocument.length - 1){ 
         output = string + ']'; // last item 
        } 
        fs.appendFile('./output.json', output ,cb); 
       } 
      }); 
     }; 
    }); 
    async.series(tasks,function(){ 
     console.log('Successfully written all documents!'); 
    }) 
}); 
+0

不幸的是,它仍然沒有按照正確的順序添加括號。逗號添加得很好,但括號會在json列表中隨機添加。 – agomez

+0

你有一個輸出文件和多個dataDocument嗎? – Ezzat

+0

dataDocument是包含項目數組的一個文件:'module.exports = [item1,item2 ...]'我想將其輸出到一個output.js文件中。謝謝。 – agomez