2016-07-15 27 views
0

我正在嘗試將一些項目推送到一個數組中,放入node.js中的JSON文件中,但我無法弄清楚如何等待數組包含之前的項目編寫JSON文件。結果是文件總是空的。我需要回電嗎?如果是這樣,怎麼樣? 注:我還是新來的Node.js在node.js中將數組對象寫入JSON

這是下面的代碼:

var getLinks = require('./news_archive/news_links.js'); 
    var request = require('request'); 
    var cheerio = require('cheerio'); 
    var fs = require('fs'); 
    var saveNews = './news_archive/news.json'; 
    var jsonObj = []; 
    var i; 
    var number_of_links = getLinks.links.length; 


    for(i=0; i<number_of_links; i++){ 

     //GET ARTICLE LINK FROM link.js 
     var url = "http://www.times.co.sz/"+getLinks.links[i]; 

     request(url, function(err, resp, body){ 
     var $ = cheerio.load(body); 

     //GET ARTICLE HEADLINE 
     var storyHeadline = $('#article_holder h1'); 
     var storyHeadlineText = storyHeadline.text(); 

     //GET DATE POSTED 
     var datePosted = $('.metadata_time'); 
     var datePostedText = datePosted.text(); 

     //GET ARTICLE REPORTER'S NAME 
     var reporterName = $('.article_metadata a'); 
     var reporterNameText = reporterName.text(); 

     //GET ARTICLE SUMMARY 
     var fullStory = $('#article_body span'); 
     var fullStoryText = fullStory.text(); 

     //PUSH ITEMS TO jsonObj ARRAY 

      jsonObj.push({ 
       id: i, 
       storyHeadline: storyHeadlineText, 
       datePosted: datePostedText, 
       reporterName: reporterNameText, 
       fullStory: fullStoryText 
     }) 

     }); 

    } //END for LOOP 

     //WRITE TO news.json file 
     fs.writeFile(saveNews, JSON.stringify(jsonObj, null, 4), function(err) { 
     if(err) { 
     console.log(err); 
     } else { 
     console.log("JSON saved to " + saveNews); 
     } 
     }); 
+0

'request'是異步的。當你寫一個文件的時候,請求還沒有完成。 –

回答

1

的問題是,請求asyncronous,你不能使用syncronous循環來遍歷。您可以使用async lib作爲

var getLinks = require('./news_archive/news_links.js'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var fs = require('fs'); 
var saveNews = './news_archive/news.json'; 
var number_of_links = getLinks.links.length; 
var async = require('async'); 


async.times(number_of_links, function (i, next) { 
    var url = "http://www.times.co.sz/"+getLinks.links[i]; 

    request(url, function(err, resp, body){ 
     var $ = cheerio.load(body); 

     //GET ARTICLE HEADLINE 
     var storyHeadline = $('#article_holder h1'); 
     var storyHeadlineText = storyHeadline.text(); 

     //GET DATE POSTED 
     var datePosted = $('.metadata_time'); 
     var datePostedText = datePosted.text(); 

     //GET ARTICLE REPORTER'S NAME 
     var reporterName = $('.article_metadata a'); 
     var reporterNameText = reporterName.text(); 

     //GET ARTICLE SUMMARY 
     var fullStory = $('#article_body span'); 
     var fullStoryText = fullStory.text(); 

     //PUSH ITEMS TO jsonObj ARRAY 

     next(err, { 
      id: i, 
      storyHeadline: storyHeadlineText, 
      datePosted: datePostedText, 
      reporterName: reporterNameText, 
      fullStory: fullStoryText 
     }); 

    }); 
}, function (err, res) { 
    // do not forget to handle error 
    fs.writeFile(saveNews, JSON.stringify(res, null, 4), function(err) { 
     if(err) { 
      console.log(err); 
     } else { 
      console.log("JSON saved to " + saveNews); 
     } 
    }); 
}) 
+0

非常感謝你!我幾乎用這個來破解我的頭。它工作完美!我嘗試了投票,但我的名聲低於15,對不起人。 – RynohRR