【问题标题】:How to properly assign payload to GET function using express.js如何使用 express.js 将有效负载正确分配给 GET 函数
【发布时间】:2017-09-28 10:11:03
【问题描述】:

我目前正在尝试学习使用 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 调用的函数的方式是我错的地方,我无法弄清楚.

也许有人可以帮助我在我的情况下正确调用爬虫?

【问题讨论】:

    标签: node.js express cheerio


    【解决方案1】:

    在回调函数中返回结果是没有意义的,这将什么都不做。

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

    希望对你有帮助,
    最好的问候

    【讨论】:

    • 谢谢,是的,这正是我需要的!
    猜你喜欢
    • 2019-11-09
    • 2017-06-20
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多