2017-04-07 94 views
0

我正在使用Express與Node.js,並對刷新行爲很困惑。在刷新/test時,由於數組長度不爲零(見下面的示例代碼),因此在刷新/test時,似乎某些東西在服務器端緩存時出現app.use。我期望數組長度重置爲零,因爲我在刷新瀏覽器時再次打到/test快速app.use刷新行爲

app.use默認情況下緩存的東西? Express中間件如何在刷新方面工作?我無法在Express 4.14文檔中找到任何明確解釋的內容。

==================

瀏覽器端點:localhost:8000/test

客戶:

$.get('/data').done(function(response){...} 

路線:

module.exports = function(app) { 
    app.get('/test', function(req,res) { 
    var arr =[]; 
    app.use('/data', function(req,res, next) { 
     console.log(arr.length); // this is nonzero on refresh 
     arr.push(/* some stuff*/); 
     res.send({"arr": arr}); 
    } 
    res.render('test.html') 
    } 
} 

服務器:

var express = require('express'); 
var app = express(); 

require('./routes/route')(app); 
app.set('views',__dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.engine('html', require('ejs').renderFile); 

var server = app.listen(8000, function() { 
    console.log("server started 8000"); 
}); 
app.use(express.static(__dirname + '/public')); 
+1

Express中間件應該只在應用程序的開始處定義一次,而不是針對每個請求。 – robertklep

回答

1

這不是真正的服務器緩存。這是因爲你在一個閉包中註冊了中間件,因此這些閉包變量(如arr)被保留下來調用中間件。另外,你一次又一次地註冊中間件(每次碰到一個新中間件/test)。

當您註冊app.use()app.get()這意味着你每次打/test路線的時候,你會再添重複app.use()處理程序中。隨着時間的推移,它們將累積,並且相同的中間件會針對相同的請求多次運行,保留原始註冊時的arr的先前值,但每個中間件都具有它們自己的數組值。

這裏的一般解決方案是不要在app.get()裏註冊app.use(),因爲你只需要一個處理程序 - 你不想讓它們累積。


目前還不清楚你想用你的app.use('/data/, ...)中間件來完成什麼。很明顯,你目前的結構是錯誤的,但是如果你不知道你想要做什麼,那麼它應該如何寫就不清楚。中間件的通常功能是在服務器初始化期間註冊一次,而不要在請求處理程序中註冊。


如果你想你的Ajax調用迴應:

$.get('/data').done(function(response){...} 

然後,你會希望有一個app.get('/data', ...)app模塊的頂部水平,使這項工作。


請解釋一下什麼是arr.push()應該完成我們在任何更詳細的幫助。

+0

@Bethany - 這是否回答你的問題?如果是這樣,您可以通過點擊答案左側的綠色複選標記來向社區表明這一點,並且這將爲您遵循正確的程序贏得一些聲望點。 – jfriend00

+0

非常感謝你的徹底迴應!我對Express/Middleware的工作原理不是很熟悉,很高興知道它應該放在頂層。 我實際上想維護這個代碼的功能,因爲它正在工作(刷新時,我不想清除數組)。我會研究會議等來實現這一目標。再次感謝! – Bethany

+1

@Bethany - 是的,看起來創建一個用戶會話對象並將該數組放入該用戶特定的會話可能就是您要做的。 – jfriend00