我正在制作一个程序,它读取包含数百个链接的数组,读取每个链接并擦除一些文本,然后将其作为json写入输出文件。
我在格式化json文件时遇到问题,因为public function ByName($Name)
{
$Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
->with('venues')->paginate(30);
return $Vendors;
}
public function ByType($Type)
{
$Types = explode('-', $Type);
$Vendors = Vendors::whereIn('Type', $Types)
->with('venues')->paginate(30);
return $Vendors;
}
public function ByArea($Area)
{
$Vendors = Vendors::where('Area', 'like', '%'.$Area.'%')
->with('venues')->paginate(30);
return $Vendors;
}
public function ByRating($Rating)
{
$Ratings = explode('-', $Rating);
$Vendors = Vendors::whereBetween('Rating', $Ratings)
->with('venues')->paginate(30);
return $Vendors;
}
public function ByReviews($Review)
{
$Reviews = explode('-', $Review);
$Vendors = Vendors::whereBetween('Reviews', $Reviews)
->with('venues')->paginate(30);
return $Vendors;
}
public function ByNameType($Name, $Type)
{
$Types = explode('-', $Type);
$Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
->whereIn('Type', $Types)
->with('venues')->paginate(30);
return $Vendors;
}
public function ByNameArea($Name, $Area)
{
$Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
->where('Area', 'like', '%'.$Area.'%')
->with('venues')->paginate(30);
return $Vendors;
}
public function ByTypeArea($Type, $Area)
{
$Types = explode('-', $Type);
$Vendors = Vendors::where('Area', 'like', '%'.$Area.'%')
->whereIn('Type', $Types)
->with('venues')->paginate(30);
return $Vendors;
}
public function ByNameTypeArea($Name, $Type, $Area)
{
$Types = explode('-', $Type);
$Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
->where('Area', 'like', '%'.$Area.'%')
->whereIn('Type', $Types)
->with('venues')->paginate(30);
return $Vendors;
}
会像这样返回json对象:
.map()
而不是像这样的json数组:
{
"id": "wajnh3ivnydeegrr",
"lorem ipsum"
},{
"id": "6yuyz57cmrgo5fbe",
"message": "lorem ipsum"
},
如何在格式正确的情况下将每个json对象推入数组? (不知何故,必须排除最后一个尾随逗号)。真的很感谢你的帮助!完整的请求如下。完整代码可在Github here中找到。
[{
"id": "wajnh3ivnydeegrr",
"lorem ipsum"
},{
"id": "6yuyz57cmrgo5fbe",
"message": "lorem ipsum"
}]
答案 0 :(得分:1)
您需要订购您的请求并了解您的第一个和最后一个请求,以便我们可以使用promises或名为async
的简单nodejs库,有一个名为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!');
})
});