2017-09-05 39 views
0

我在基本節點應用程序中的第一次嘗試。通過Express傳遞數組時獲取'undefined'res.render函數

如果我測試運行此文件(> node index.js)與其中的console.log(eventsArray),陣列成功從命令窗口中刮板模塊輸出數據,所以我的刮板模塊正在工作。

如果我設置eventsArray = ['this','is,'a','test','array'];在index.js中作爲一個測試,然後這些字符串會顯示在主頁上,就像在Express中運行應用程序後我想要的那樣,所以Express + Jade模板正在工作(因爲它正在工作,所以無需在此處包含我的ejs模板)。

問題:如果我嘗試按如下所示運行應用程序(> node index.js),eventsArray在傳遞到res.render函數時顯示爲'undefined',所以沒有顯示在localhost:3000上(主頁)

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

嘿,其中eventsClean定義,似乎getEvents做沒有回報什麼?您可以將「回調」添加到getEvents函數或使用「Promise」。 {return scraperjs.StaticScraper .... new Promise(function(resolve){resolve(eventsClean)})}或getEvents(callback){... callback(eventsClean)...} –

回答

1

getEvents回報什麼,除了這scraperjs.StaticScraper.create是ASYN c函數返回一個promise。

您應該返回異步從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 
     }); 
} 

而且在行動創造一個承諾連鎖使用它:

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