2016-07-31 33 views
0

我正在嘗試構建一個實時網頁以顯示一些實時統計信息。這個網頁有12個組件。我在SetTimeout中使用Ajax來更新每個組件。由於我想以不同頻率更新每個組件,因此我爲每個組件編寫了一個setTimeout函數,併爲每個組件提供了一個鏈接(在「main.js」中定義)。看起來像:在Node.js中,如何更新不同頻率頁面的不同組件?

(function poll() { 
setTimeout(function() { 
    $.ajax({ 

    url: url1, 
    type: 'GET', 
    success : function(info){ 
     var object = document.getElementById("1"); 
     object.textContent = info; 

    }, complete: poll }); 
    }, 5000); 
})(); 

    ... 
    ... 

(function poll() { 
setTimeout(function() { 
    $.ajax({ 

    url: url12, 
    type: 'GET', 
    success : function(info){ 
     var object = document.getElementById("12"); 
     object.textContent = info; 

    }, complete: poll }); 
    }, 10000); 
})(); 

而在我的「server.js」,我希望連接到數據庫只有一次,然後渲染不同的組件。數據庫的配置將依賴的鏈接,所以我安排這樣的應用:

app.get('/:A/:B', function(req,res){ 

    var A= req.params.A; 
    var B = req.params.B; 
    var config = something relies on A and B 

    var client = new pg.Client(config); 

    client.connect(function(err){ 
     if (err) { 
     console.log("Error occurred when try to connect the database",err); 
    } 
     else { 
     res.sendFile(__dirname + '/public/main.html'); 

     app.get('/main.js', function(req,res){ 
     res.sendFile(__dirname + '/public/main.js'); 
     }); 

     app.get('/url1',function(req,res) { 
     //query database and send the data url1 needs 
     }); 

     ... 
     ... 
     app.get('/url12',function(req,res) { 
     //query database and send the data url12 needs 
     }); 


    }) 

我要問,如果寫「app.get()」中的「app.get()」之類上面的代碼是很好的做法。如果不是,我如何保持與數據庫的全局連接並將其用於不同的組件?另外,我可以對這個網絡應用程序有任何改進嗎?我很新Node.js

+0

使用websocket代替AJAX獲得更多性能 –

+0

您不能將'app.get()'放在另一個'app.get()'內。這些處理程序安裝在您的服務器上供所有用戶使用,因此這絕不會是所需的行爲。 – jfriend00

回答

1

如果我必須做回調而不是承諾,這是我如何做服務器端。

首先,我將使用您的端點來獲取客戶端,但會將其放入模塊內部變量中,並且如果我無法連接到數據庫,仍會發送響應。

var db=null; 
app.get('/:A/:B', function(req,res){ 

var A= req.params.A; 
var B = req.params.B; 
var config = something relies on A and B 

var client = new pg.Client(config); 

client.connect(function(err){ 
    if (err) { 
    console.log("Error occurred when try to connect the database",err); 
    res.status(503).send("Error connecting to database); 
    } 
    else { 
    db = client; 
    res.sendFile(__dirname + '/public/main.html'); 
    } 
} 
} 

然後,我會寫會重用DB如果它存在的函數:

function usingDatabase(req,res,next){ 
    if(db) { 
     req.db=db; 
     next(); 
    } 
    else { 
     res.status(400).send("Bad request. open the DB first by calling /:A/:B"); 
    } 
} 

最後我會使用這樣的: app.get( '/ main.js' ,函數(req,res){res.sendFile(__ dirname +'/ public/main.js'); });

app.get('/url1',usingDatabase, function(req,res) { 
    // db is in req.db; 
    //query database and send the data url1 needs 
    }); 

    ... 
    ... 
    app.get('/url12',usingDatabase,function(req,res) { 
    // db is in req.db; 
    //query database and send the data url12 needs 
    }); 
+0

謝謝!這個結構看起來更乾淨,完美的作品:) – bananana

相關問題