如何使用 express.js 将有效载荷正确分配给 GET 函数
How to properly assign payload to GET function using express.js
我正在尝试学习使用 node + express +cheerio 构建爬虫。
在我放的路线中:
[index.js]
app.get('/api/crawler/android', crawlerController.android);
调用控制器
[crawler-controller.js]
var androidCrawler = require('../crawlers/android')
module.exports.android = androidCrawler.androidget;
然后我调用爬虫(基于 cheerio)
[crawler.js]
var request = require('request');
var cheerio = require('cheerio');
var androidget =request('https://www.developer-tech.com/categories/Android/', function (error, response, html){
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
var result = {result:[]};
$('article').each(function (i, element) {
var Title = $(this).find("h2").text();
var Link = $(this).find("a").attr("href");
var Image = $(this).find("img").attr("src");
var payload = {
"Title":Title,
"Link":Link,
"Image":Image
};
result['result'].push(payload);
});
console.log("aaa", result);
console.log(typeof result);
return result;
}});
module.exports = {
getAndroid: function (androidget, res) {
res.send(JSON.stringify(result));
}
}
当我通过终端控制台直接登录到 crawler.js 时,它 return JSON 对象正确,但我认为导出函数的方式将被 app.get 调用是我错的地方,我想不通。
也许有人可以帮助我在我的案例中正确调用爬虫?
在回调函数中返回结果是没有意义的,这将什么都不做。
您可以做的是将您的请求包装在一个函数中并调用您创建的回调:
// file.js
常量 wrapFunction = (url, 回调) => {
请求(url,((错误,响应,html)=> {
// ...
回调(结果);
})
}
然后使用它:
// just an example
wrapFunction(yourUrl, (result) => {
// deal with your result
})
当你拥有它时,你可以导出它然后在你的中间件/控制器中使用它:
// file.js
module.exports = wrapFunction;
// index.js
const wrapFunction = require('file.js'); // here is your function
app.get('/yourRoute', (req, res) => {
wrapFunction(yourUrl, (result) => {
res.send(JSON.stringify(result));
});
})
你也可以使用 Promises :
const wrapFunction = (url) => {
return new Promise((resolve, reject) => {
request(url, ((error, response, html) => {
if (error) reject(error);
resolve(result);
});
});
};
然后:
wrapFunction(yourUrl).then(result => {
// deal with your result ...
}).catch(error => {
// deal with your error ...
});
希望对您有所帮助,
最好的问候
我正在尝试学习使用 node + express +cheerio 构建爬虫。 在我放的路线中:
[index.js]
app.get('/api/crawler/android', crawlerController.android);
调用控制器
[crawler-controller.js]
var androidCrawler = require('../crawlers/android')
module.exports.android = androidCrawler.androidget;
然后我调用爬虫(基于 cheerio)
[crawler.js]
var request = require('request');
var cheerio = require('cheerio');
var androidget =request('https://www.developer-tech.com/categories/Android/', function (error, response, html){
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
var result = {result:[]};
$('article').each(function (i, element) {
var Title = $(this).find("h2").text();
var Link = $(this).find("a").attr("href");
var Image = $(this).find("img").attr("src");
var payload = {
"Title":Title,
"Link":Link,
"Image":Image
};
result['result'].push(payload);
});
console.log("aaa", result);
console.log(typeof result);
return result;
}});
module.exports = {
getAndroid: function (androidget, res) {
res.send(JSON.stringify(result));
}
}
当我通过终端控制台直接登录到 crawler.js 时,它 return JSON 对象正确,但我认为导出函数的方式将被 app.get 调用是我错的地方,我想不通。
也许有人可以帮助我在我的案例中正确调用爬虫?
在回调函数中返回结果是没有意义的,这将什么都不做。
您可以做的是将您的请求包装在一个函数中并调用您创建的回调: // file.js 常量 wrapFunction = (url, 回调) => { 请求(url,((错误,响应,html)=> { // ... 回调(结果); }) }
然后使用它:
// just an example
wrapFunction(yourUrl, (result) => {
// deal with your result
})
当你拥有它时,你可以导出它然后在你的中间件/控制器中使用它:
// file.js
module.exports = wrapFunction;
// index.js
const wrapFunction = require('file.js'); // here is your function
app.get('/yourRoute', (req, res) => {
wrapFunction(yourUrl, (result) => {
res.send(JSON.stringify(result));
});
})
你也可以使用 Promises :
const wrapFunction = (url) => {
return new Promise((resolve, reject) => {
request(url, ((error, response, html) => {
if (error) reject(error);
resolve(result);
});
});
};
然后:
wrapFunction(yourUrl).then(result => {
// deal with your result ...
}).catch(error => {
// deal with your error ...
});
希望对您有所帮助,
最好的问候