如何使用express.js正确地将有效负载分配给GET函数

时间:2017-09-28 10:11:04

标签: node.js express cheerio

我正在尝试使用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时,它会正确返回JSON对象,但我认为导出app.get调用的函数的方式是我错了,我无法弄明白

也许有人可以帮我在我的情况下正确调用抓取工具?

1 个答案:

答案 0 :(得分:0)

没有必要在回调函数中返回结果,这只会做什么。

您可以做的是将您的请求包装在一个函数中并调用您创建的回调:     // file.js     const wrapFunction =(url,callback)=> {       request(url,((error,response,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));
  });
})

您还可以使用Promise:

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

希望它有所帮助,
最好的问候