2015-09-02 169 views
0

我有一個網頁在Node.js中運行(我使用ejs來使用WebStorm提供的默認文件夾設置來呈現頁面)。目前,我跑node bin/www它包含以下內容:Node.js頁面刷新後重新運行頁面(並生成新數據)

***preamble*** 
var app = require('../app'); 
var debug = require('debug')('tennis-geek:server'); 
var http = require('http'); 
var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 
var server = http.createServer(app); 
***rest of code*** 

這然後運行app.js文件,該文件包含以下內容:

... 
var predictions = require("./routes/predictions"); 
app.use("/predictions", predictions); 
... 

這就是問題所在。在此頁面的javascript文件(routes/predictions.js)中,我想要顯示從兩個遠程源(www.source_json.comwww.source_csv.com)收集的信息(由於只有兩個來源我決定同步執行Web請求)。這是我不希望最終用戶能夠訪問的私人信息,所以我認爲最好是將這些數據服務器端進行處理和合並,然後保存我希望用戶能夠看到的任何最終數據成javascript對象稱爲data_array並經由發送到相應的頁面ejsviews/predictions.ejs):

var express = require('express'); 
var router = express.Router(); 
var recline = ("reclinejs"); 
var papa = require("papaparse"); 
var request = require('sync-request'); 

    //Now I collect the Data. 

var res = request('GET', 'www.source_json.com'); 
var data_1_json = JSON.parse(res.getBody('utf8')); 
res = request('GET', 'www.source_csv.com'); 
var data_2_json = papa.parse(res.getBody('utf8'), {header: true, skipEmptyLines: true}).data; 

    //Now I do some private number crunching on the data 

var data_array = private_number_crunching(data_1_json, data_2_json); 

    //Now I send make this information available to the user's browser 

router.get('/', function (req, res, next) { 
    res.render('predictions', {title: 'Predictions', data_from_js: data_array}); 
}); 
module.exports = router; 

從約每20分鐘的兩個遠程源改變所收集的數據。但是,當我刷新頁面時,數據不會從兩個數據源中重新收集(我已經使用一些時間戳驗證了這一點)。 如何在每次請求頁面時要求Node.js返回新鮮源數據?有沒有一個update button我可以在頁面上創建,或者我可以添加一些JavaScript?目前,我可以刷新信息的唯一方法是重新啓動服務器(CTRL + C + node bin/www)。

到目前爲止,我已經嘗試使用setInterval循環,while循環,加入<% setTimeout('window.location.reload();', 20000); %>。此外,我已考慮使用nodemon來觀察某些僞文件,該文件可能包含數據源上次更改信息的時間,然後在發生更改時重新啓動服務器,但我想避免這種情況。

此外,我已經看過 「類似的」 主題:

回答

0

檢查,如果這個工程:

var express = require('express'); 
var router = express.Router(); 
var recline = ("reclinejs"); 
var papa = require("papaparse"); 
var request = require('sync-request'); 

//Now I collect the Data. 



//Now I send make this information available to the user's browser 

router.get('/', function (req, res, next) { 
    var response1 = request('GET', 'www.source_json.com'); 
    var data_1_json = JSON.parse(response1.getBody('utf8')); 
    var response2 = request('GET', 'www.source_csv.com'); 
    var data_2_json = papa.parse(response2.getBody('utf8'), {header: true,  skipEmptyLines: true}).data; 

    //Now I do some private number crunching on the data 

    var data_array = private_number_crunching(data_1_json, data_2_json); 
    res.render('predictions', {title: 'Predictions', data_from_js: data_array}); 
    }); 
    module.exports = router; 
+0

我已經重構代碼到上述form(在router.get('/',...')之前定義'private_number_crunching()'函數,並且該函數在'router.get('/',...''外部正常工作,但是使用上面的代碼在瀏覽器中給出了以下錯誤: 'undefined不是函數''TypeError:undefined不是函數' '在/Users/oliver/WebstormProjects/tennis-geek/routes/predictions.js:248:9',其中第248行是指'res.render('predictions'....);'。任何想法爲什麼它似乎不喜歡這個範圍內的功能? (感謝@LiterallyIlliterate的回覆) – oliversm

+0

另外,在控制檯中,它給出了這樣的信息:'無法加載資源:服務器響應狀態爲500(內部服務器錯誤)'。 – oliversm

+0

我已經更改了代碼,變量中的「res」肯定是問題所在。 –