2016-08-22 135 views
0

我正在使用基於cron的schedular命中每2分鐘給我一個json數據的外部api。我將數據寫入文件然後讀取它,清理數據並將其添加到mongodb中的集合中。它工作正常第一次,但第二次我得到這樣一個錯誤: -無法第二次讀取json文件:「意外的輸入錯誤結束」

C:\smatserver\smatserver\deals.js:74 
       throw err; 
       ^

SyntaxError: ./files/localdeals.json: Unexpected end of input 
    at Object.parse (native) 
    at C:\smatserver\smatserver\node_modules\jsonfile\index.js:31:18 
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3) 

這裏是deals.js代碼中我打的外部API和文件保存和讀取,並試圖將其推到MongoDB的: -

var schedule=require('node-schedule'); 
var request=require('request'); 
var jsonfile = require('jsonfile'); 
var _=require('underscore'); 
var LocalDeals=require('./models/localdeal.js'); 
//run job every 2 minutes 

var dataSchedular=schedule.scheduleJob('*/2 * * * *', function(){ 
    var local_deals_file='./files/localdeals.json'; 
    var local_deals_url='http://api.8coupons.com/v1/getdeals?key=API_KEY&mileradius=10&limit=100&orderby=radius'; 
    request({url:local_deals_url, 
     json:true 
    }, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 
     jsonfile.writeFile(local_deals_file, body, {spaces: 2}, function(err) { 
     console.error(err); 
    }); 
     console.log('File write success for '+local_deals_file); 
     //problem area 
     jsonfile.readFile(local_deals_file, function(err, local_deals_obj) { 
      //save in mongodb collection 
      if(err){ //this error gets thrown on 2nd read 
       throw err; 
      } 
      local_deals_obj.forEach(function(local_deal_obj){ 
       var local_deal_filtered=_.pick(local_deal_obj, 'name', 'address', 'storeID','chainID','phone','state','city','ZIP','URL','storeURL', 
       'dealTitle','dealinfo','expirationDate','postDate','showImageStandardBig','showImageStandardSmall','providerName','DealTypeID','categoryID', 
       'lat','lon','distance','dealOriginalPrice','dealPrice','dealSavings','dealDiscountPercent'); 

       var new_local_deal=new LocalDeals({ 
        name  : local_deal_filtered.name, 
        address : local_deal_filtered.address, 
        storeID : local_deal_filtered.storeID, 
        chainID : local_deal_filtered.chainID, 
        phone  : local_deal_filtered.phone, 
        state  : local_deal_filtered.state, 
        city  : local_deal_filtered.city, 
        ZIP  : local_deal_filtered.ZIP, 
        URL  : local_deal_filtered.URL, 
        storeURL : local_deal_filtered.storeURL, 
        dealTitle : local_deal_filtered.dealTitle, 
        dealinfo : local_deal_filtered.dealinfo, 
        expirationDate:local_deal_filtered.expirationDate, 
        postDate : local_deal_filtered.postDate, 
        showImageStandardBig: local_deal_filtered.showImageStandardBig, 
        showImageStandardSmall: local_deal_filtered.showImageStandardSmall, 
        providerName: local_deal_filtered.providerName, 
        DealTypeID: local_deal_filtered.DealTypeID, 
        categoryID: local_deal_filtered.categoryID, 
        lat: local_deal_filtered.lat, 
        lon: local_deal_filtered.lon, 
        distance: local_deal_filtered.distance, 
        dealOriginalPrice: local_deal_filtered.dealOriginalPrice, 
        dealPrice: local_deal_filtered.dealPrice, 
        dealSavings: local_deal_filtered.dealSavings, 
        dealDiscountPercent: local_deal_filtered.dealDiscountPercent 
       }); 

       LocalDeals.saveLocalDeals(new_local_deal,function(err,deal){ 
        if(err){ 
         throw err; 
        }else{ 
         //console.log("local deals added to mongodb"); 
        } 
       }); 
      }); 
     }); 


     } 
     else{ 
      console.log(error); 
     } 
    }); 

}); 

module.exports=dataSchedular; 

,這裏是叫我的模型文件localdeal.js: -

var mongoose=require('mongoose'); 

mongoose.connect('mongodb://localhost/smat'); 
var db=mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log('Successfully connected to mongodb'); 
}); 

var localdealsSchema=mongoose.Schema({ 
    name: { 
     type: String 
    }, 
    address:{ 
     type: String 
    }, 
    storeID:{ 
     type: String 
    }, 
    chainID:{ 
     type: String 
    }, 
    phone:{ 
     type: String 
    }, 
    state:{ 
     type: String 
    }, 
    city:{ 
     type: String 
    }, 
    ZIP:{ 
     type: String 
    }, 
    URL:{ 
     type: String 
    }, 
    storeURL: { 
     type: String 
    }, 
    dealTitle:{ 
     type: String 
    }, 
    dealinfo:{ 
     type: String 
    }, 
    expirationDate:{ 
     type: String 
    }, 
    postDate:{ 
     type: String 
    }, 
    showImageStandardBig:{ 
     type: String 
    }, 
    showImageStandardSmall:{ 
     type: String 
    }, 
    providerName:{ 
     type: String 
    }, 
    DealTypeID:{ 
     type: Number 
    }, 
    categoryID:{ 
     type: Number 
    }, 
    lat:{ 
     type: Number 
    }, 
    lon:{ 
     type: Number 
    }, 
    distance:{ 
     type: Number 
    }, 
    dealOriginalPrice:{ 
     type: Number 
    }, 
    dealPrice:{ 
     type: Number 
    }, 
    dealSavings:{ 
     type: Number 
    }, 
    dealDiscountPercent:{ 
     type: Number 
    } 
}); 

var LocalDeals=module.exports=mongoose.model('LocalDeals',localdealsSchema); 

module.exports.saveLocalDeals=function(newLocalDeals, callback){ 
    newLocalDeals.save(callback); 
} 

回答

1

在我讀該文件的一部分,我需要一個setTimeout的,因爲它需要一些時間來寫到th e文件。所以這裏是我的改變: -

setTimeout(function(){ 
     jsonfile.readFile(local_deals_file, function(err, local_deals_obj) { 
      //the code same as above 

}) 
}, 1000); //waiting a second to read file 
2

在這種情況下不要使用setTimeout! writeFile返回回調! ^^

只要把READFILE在WriteFile的回調

jsonfile.writeFile(local_deals_file, body, {spaces: 2}, function(err) { 
    if(err){ 
     // error case 
    } 
    else 
    { 
     jsonfile.readFile(local_deals_file, function(err, local_deals_obj) { 
      if(err){ 
      // error case 
      } 
      else 
      { 
       // do something 
      } 
     }); 
    } 
}); 

但在閱讀文件?你可以簡單地解析響應主體:

jsonfile.writeFile(local_deals_file, body, {spaces: 2}, function(err) { 
    if(err){ 
     // error case 
    } 
    else 
    { 
     var obj = null; 
     try 
     { 
      obj = JSON.parse(body); 
     } 
     catch(err){ 
      obj = null; 
     } 
     if(obj === null) 
     { 
      // error case 
     } 
     else 
     { 
       // insert in mongo 
     } 

    } 
}); 
+0

有趣的答案...我會試一試,然後接受你的答案..但你能解釋我爲什麼要避免setTimeout? –

+0

如果你寫了一個大文件,setTimeout可以在寫入結束之前完成。在這種情況下,讀操作可能會在寫操作結束之前結束。 – Dafuck

+0

你說得對我最終使用你的解決方案 –

相關問題