gpt4 book ai didi

javascript - 无法第二次读取json文件: "Unexpected end of input error"

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:13 25 4
gpt4 key购买 nike

我正在使用基于 cron 的计划来访问外部 api,该 API 每 2 分钟为我提供 json 数据。我将数据写入文件,然后读取它,清理数据并将其添加到 mongodb 中的集合中。第一次工作正常,但第二次我收到这样的错误:-

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);
}

最佳答案

在这种情况下切勿使用 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
}

}
});

关于javascript - 无法第二次读取json文件: "Unexpected end of input error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com