得到' undefined'通过Express res.render函数传递数组时

时间:2017-09-05 12:50:46

标签: javascript node.js express ejs scraper

我第一次尝试使用基本节点应用程序。

如果我在其中测试运行此文件(>节点index.js)并使用console.log(eventsArray),则数组会在命令窗口中成功打印出刮刀模块中的数据,因此我的刮刀模块正在运行。

如果我设置eventsArray = ['这','是' a',' test','数组&#39 ];在index.js作为测试,然后这些字符串确实显示在主页上,就像我想用Express运行应用程序后,所以Express + Jade模板正常工作(不需要在这里包含我的ejs模板,因为它正在工作)

问题:如果我尝试运行如下所示的应用程序(> node index.js),则eventsArray似乎未定义'当它被传递到res.render函数时,所以没有任何东西显示在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;

1 个答案:

答案 0 :(得分:0)

你的getEvents什么都不返回,除了这个scraperjs.StaticScraper.create是异步函数,它返回一个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 }));
});