我第一次尝试使用基本节点应用程序。
如果我在其中测试运行此文件(>节点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;
答案 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 }));
});