【问题标题】:Getting 'undefined' when passing an array through Express res.render function通过 Express res.render 函数传递数组时获取“未定义”
【发布时间】:2017-09-05 12:50:45
【问题描述】:

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

如果我用 console.log(eventsArray) 测试运行这个文件 (> node index.js),数组成功地从命令窗口中的刮板模块打印出数据,所以我的刮板模块正在工作。

如果我设置 eventsArray = ['this','is,'a','test','array'];在 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;

【问题讨论】:

  • 嘿,eventsClean 定义在哪里,似乎 getEvents 没有返回任何东西?您可以将“回调”添加到 getEvents 函数或使用“承诺”。 {return scraperjs.StaticScraper.... new Promise(function(resolve) {resolve(eventsClean)})} 或 getEvents(callback) {... callback(eventsClean) ...}

标签: javascript node.js express ejs scraper


【解决方案1】:

你的getEvents 什么都不返回,除了这个scraperjs.StaticScraper.create 是异步函数,它返回一个承诺。

你应该从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 }));
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多