有条件地将EJS模板视图呈现到同一路径

时间:2019-05-17 02:34:31

标签: javascript node.js sqlite express ejs

所以,这是一个非常新手的问题,但是我搜索了几个小时,却找不到这个特定的问题(我知道我在做一些愚蠢的事情)。

我正在从简单的sqlite数据库表中获取数据,处理某些行是否为特定值,将它们推入表(我用来将其推入EJS页面之一),然后希望基于表中是否有数据。

我想以一定间隔(使用setInterval)读取表,然后如果有更改,请更新“视图”。

除了EJS页面实际上必须从一个页面切换到另一页面之外,其他所有功能都运行良好。渲染完成后,我什至不确定是否可以执行此操作。但是,我宁愿仅在同一路径('/')上呈现不同的页面,该页面在浏览器刷新时会更改。

初始条件语句呈现正确的EJS页面,但是就像我说的那样,一旦需要切换,该页面将保持在浏览器刷新状态。

我尝试将条件的放置位置移动到多个位置(在“获取”内部,外部等等)。

还尝试在单个EJS页面中执行“ if”语句,但是一旦呈现初始页面然后使用setInterval再次调用该函数,它就不会刷新。


var sqlite3 = require('sqlite3').verbose();
var express = require('express');
var app = express();
fs = require('fs')

app.set('view engine', 'ejs');

function query(){
  var db = new sqlite3.Database('./my_database.sqlite', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
      console.error(err.message);
    }
    console.log('Connected to the chinook database.');
  });

  var sql = `SELECT column1 column1
              FROM myTable
             WHERE column1 = ?`;

  var mkts = []
  db.each(sql, ['a'], (err, row) => {
   if (err) {
     throw err;
   }
   mkts.push(row.column1);
   console.log(mkts);
  });




  db.close((err) => {
    if (err) {
      return console.error(err.message);
    }
    console.log('Close the database connection.');
    console.log(mkts.length);
    if(mkts.length>0){
      console.log(true);
      app.get('/', function(req, res){
        res.render('alert', {mkts:mkts});
      });
    }else{
      console.log(false);
      app.get('/', function(req, res){
        res.render('index', {mkts:mkts});
      });
    }

  });
};
query();
setInterval(() => query(), 10000);

app.listen(3000);

因此,基本上在打开然后查询所需的数据之后,我在db.close上运行get和render。在这段代码中,当数据库发生更改时,我可以使“ true”和“ false”正确记录下来,但是一旦运行了总体功能,渲染就不会更改。

很抱歉,如果它很难阅读,但是整天让我发疯。

1 个答案:

答案 0 :(得分:0)

您的逻辑(检索数据,视图开关)必须位于您的app.get(“ /” ... 在这里,您仅查询一次数据(在服务器上),并使用静态数据设置静态路由。

尝试这样的事情:

// connect to db on startup
var db = new sqlite3.Database('./my_database.sqlite', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
      console.error(err.message);
    }
    console.log('Connected to the chinook database.');
  });

// define your routes
app.get('/', function(req, res){

      // when route is asked by your browser retrieve the datas
      var sql = `SELECT column1 column1
              FROM myTable
             WHERE column1 = ?`;

      var mkts = []
      db.each(sql, ['a'], (err, row) => {
       if (err) {
          throw err;
       }
        mkts.push(row.column1);
        console.log(mkts);
      });

     // render the good view according to your datas
     if(mkts.length>0){
          res.render('alert', {mkts:mkts});
     }
     else {
          res.render('index', {mkts:mkts});
     }

});

app.listen(3000);

此外,您无法在此处完成刷新视图的setInterval,客户端必须询问“刷新”。在您看来,只需在javacript中添加如下内容:

  <script>setTimeout(function(){document.location.reload();}, 1000);</script>