2017-09-05 6 views
0

Ma première tentative d'application de noeud de base. Si je teste ce fichier (> node index.js) avec console.log (eventsArray) à la place, le tableau imprime avec succès les données du module scraper dans la fenêtre de commande, donc mon module scraper fonctionne. Et si j'ai défini eventsArray = ['this', 'is,' a ',' test ',' tableau ']; dans index.js comme test, ces chaînes apparaissent sur la page d'accueil comme je le veux après avoir exécuté l'application avec Express, donc le modèle Express + Jade fonctionne (pas besoin d'inclure mon template ejs ici car il fonctionne). Le problème: Si j'essaie d'exécuter l'application comme indiqué ci-dessous (> node index.js), eventsArray semble être 'indéfini' quand il est passé dans la fonction res.render, donc rien ne s'affiche sur localhost: 3000 (page d'accueil)Obtention d'un 'indéfini' lors du passage d'un tableau via la fonction Express res.render

index.js:

var myScraperModule = require('./src/scraper'); // import my scraper function 
var express = require('express'); 
var app = express(); 

eventsArray = myScraperModule.getEvents(); // returns an array 

app.set('port', process.env.PORT || 3000); 

app.get('/', function(req, res) { 
    res.render('index.ejs', {data : eventsArray }); // send array to homepage 
}); 


app.listen(app.get('port'), function(){ 
    console.log("express started") 
}); 

scraper.js:

// basic web scraper using scraperjs module 
var scraperjs = require('scraperjs'); 

function getEvents(){ 
scraperjs.StaticScraper.create('https://examplewebsite.com/') 
    .scrape(function($) { 
     return $("p").map(function() { 
       return $(this).html(); 
      } 
     }).get(); 
    }) 
    .then(function(data) { 
     //... clean up the data and return it as eventsClean 
     return eventsClean; // return an array of strings 
     } 
    }); 
} 

module.exports = getEvents; 
+0

Hey, où est eventsClean défini, et il semble que GetEvents ne ne retourne rien? Vous pouvez ajouter 'callback' à la fonction getEvents ou utiliser 'Promise'. {return scraperjs.StaticScraper .... nouvelle promesse (function (resolve) {resolve (eventsClean)})} ou getEvents (callback) {... callback (eventsClean) ...} –

Répondre

1

Votre rien getEvents de retour, en plus de ce scraperjs.StaticScraper.create est asyn c la fonction renvoie une promesse.

Vous devez renvoyer le résultat async de getEvents:

function getEvents(){ 
    return scraperjs.StaticScraper 
     .create('https://examplewebsite.com/') 
     .scrape(function($) { 
     return $("p").map(function() { 
      return $(this).html(); 
     }).get(); 
     }) 
     .then(function(data) { 
     //... clean up the data and return it as eventsClean 
     return eventsClean; // return an array of strings 
     }); 
} 

et l'utiliser dans l'action avec la création d'une chaîne de promesse:

app.get('/', function(req, res) { 
    myScraperModule 
    .getEvents() 
    .then(eventsArray => res.render('index.ejs', {data : eventsArray })); 
});