2017-09-05 106 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 })); 
});