2017-09-28 2 views
0

J'essaye actuellement d'apprendre à construire un robot en utilisant node + express + cheerio. Dans la route je mets ceci:Comment affecter correctement la charge utile à la fonction GET en utilisant express.js

[index.js]  
app.get('/api/crawler/android', crawlerController.android); 

qui appelle dans le contrôleur

[crawler-controller.js] 
var androidCrawler = require('../crawlers/android') 
module.exports.android = androidCrawler.androidget; 

j'invoquez le robot d'exploration (basé sur 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)); 
    } 
} 

Lorsque je console connecter directement à chenilles .js via le terminal il renvoie correctement l'objet JSON, mais je pense que la façon dont j'exporte la fonction à invoquer par app.get est là où j'ai tort et je n'arrive pas à comprendre.

Peut-être quelqu'un pourrait m'aider à invoquer correctement le robot dans mon cas?

Répondre

0

Il ne sert à rien de renvoyer un résultat dans une fonction de rappel, cela ne fera rien.

Qu'est-ce que vous pouvez faire est Enveloppez votre demande en fonction et appeler un rappel que vous créez: // file.js const wrapFunction = (url, callback) => { demande (URL, ((erreur, réponse, html) => {// ... rappel (résultat); })}

puis l'utiliser:

// just an example 
wrapFunction(yourUrl, (result) => { 
    // deal with your result 
}) 

Quand vous avez cela, vous pouvez l'exporter et alors utilisez-le dans votre middleware/Contrôleur:

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

Vous pouvez également utiliser Promises:

const wrapFunction = (url) => { 
    return new Promise((resolve, reject) => { 
    request(url, ((error, response, html) => { 
     if (error) reject(error); 
     resolve(result); 
    }); 
    }); 
}; 

Et puis:

wrapFunction(yourUrl).then(result => { 
    // deal with your result ... 
}).catch(error => { 
    // deal with your error ... 
}); 

J'espère que cela aide,
Sincères salutations

+0

Merci, oui c'est ce dont j'ai besoin! –