2017-09-05 1 views
0

기본 노드 응용 프로그램에서 처음 시도했습니다.Express res.render 함수를 통해 배열을 전달할 때 '정의되지 않음'얻기

대신 console.log (eventsArray)를 사용하여이 파일 (> node index.js)을 실행하여 테스트하면 어레이가 명령 창에서 스크래퍼 모듈의 데이터를 성공적으로 인쇄하므로 내 스크래퍼 모듈이 작동합니다.

eventsArray = [ 'this', 'is', 'test', 'array'];를 설정하면; index.js 테스트에서,이 문자열은 내가 익스프레스로 앱을 실행 한 후 원하는대로 익스프레스 + 비취 템플릿이 작동하고 있기 때문에 홈페이지에 표시됩니다 (작동 중이기 때문에 여기에 내 ejs 템플릿을 포함 할 필요가 없습니다).

문제 : 아래와 같이 노드 인덱스 (.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; 
+0

헤이, eventsClean가 정의, 그리고 getEvents가하는 것 같다 아무것도 돌려주지 않습니까? getEvents 함수에 '콜백'을 추가하거나 'Promise'를 사용할 수 있습니다. {return scraperjs.StaticScraper .... 새로운 약속 (function (resolve) {resolve (eventsClean)})} 또는 getEvents (콜백) {... 콜백 (eventsClean) ...} –

답변

1

귀하의 getEvents 아무것도 반환이 scraperjs.StaticScraper.create이 asyn된다 외에 c 함수는 약속을 반환합니다.

당신은 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 })); 
}); 
관련 문제