在Node.js中,如何以不同的频率更新页面的不同组件?

时间:2016-07-31 05:13:37

标签: javascript ajax node.js express

我正在尝试构建一个实时网页来显示一些实时统计信息。该网页有12个组件。我在SetTimeout中使用Ajax来更新每个组件。由于我想以不同的频率更新每个组件,我为每个组件编写了一个setTimeout函数,并为每个组件提供了一个链接(在" main.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
       });


    })

我想问一下是否写了#34; app.get()"在" app.get()"像上面的代码是很好的做法。如果没有,我如何保持与数据库的全局连接并将其用于不同的组件?此外,我可以对此网络应用程序进行任何改进吗?我对Node.js来说很新鲜

1 个答案:

答案 0 :(得分:1)

如果我不得不使用回调而不是承诺来执行此操作,那么我将在服务器端执行此操作。

首先,我会使用你的端点来获取客户端,但是会把它放在模块内部变量中,如果我没有连接到DB,仍会发送响应。

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');
  }
}
}

然后,我会编写一个函数,如果它存在,将重用该数据库:

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',function(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
   });