我正在尝试使用节点js构建Web剪贴板。我有一个数组,它将具有动态大小。该数组包含我需要访问的URL列表。我使用https://scotch.io/tutorials/scraping-the-web-with-node-js进行网页报废。我正在使用请求模块为节点js创建请求。我推荐了这个http://www.sebastianseilund.com/nodejs-async-in-practice,我猜async.forEach应该对我的场景很有用,但是我无法理解如何让API等到所有网页报废结果都没有获得。我是节点js的新手。对此的任何指导对我来说都非常有帮助。
好。我添加了某种代码,我尝试但不按我想要的方式工作。 我希望Async方法的所有输出在某个数组中连接为对象列表,并将其作为JSON发送给客户端。
var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app = express();
var async = require('async');
app.get('/scrape', function(req, res){
//URL list will be dynamic.
var urlList = ['1','2','3'];
//async for each
async.forEach(urlList,function(url,callback){
request({url: url,
headers:{
'User-Agent': 'spider'
}
}, function(error, response, html){
debugger;
if(!error){
debugger;
var $ = cheerio.load(html);
$('span').filter(function(){
debugger;
var data = $(this);
//console.log(data)
var someprocessedValue = data.attr('data');
//release = data.children().last().children().text();
callback(someprocessedValue);
})
}
});
},
function(err){
if(err) console.log(err);
res.send('Check your console!');
});
});

根据@Robrich的回答,我修改了代码并到达了它正在工作的地方。如果有人想在以后使用它,我发布代码以供参考。
app.get('/scrape', function(req, res)
{
var urlList=['http://a.com','http://b.com'];
async.map(urlList,scrapper,function(err,results){
if(err){
}
else
{
res.send('Check your console!');
}
});
}
var scrapper = function(url,cb){
var data = new Object();
data.url = url;
data.isError = false;
request({url: url,
headers:{
'User-Agent': 'spider'
}
}, function(error, response, html){
//debugger;
if(!error){
//debugger;
var $ = cheerio.load(html);
//some logic
return cb(null,data);
}
else{
data.IsError=true;
return cb(error,data);
}
});
}

我上面的代码可能会出现支撑问题。但我按照我想要的方式工作。 谢谢!