Условная отрисовка представлений шаблона EJS по тому же пути - PullRequest
0 голосов
/ 17 мая 2019

Итак, очень новый вопрос, но я искал пару часов и не смог найти эту конкретную проблему (я знаю, что делаю что-то глупое).

Я собираю данные из простой базы данных sqliteтаблица, обрабатывая, если определенные строки имеют определенное значение, помещая их в таблицу (которую я использую для перемещения на одну из страниц EJS), а затем хочу отобразить страницу, основываясь на том, есть ли какие-либо данные в таблице или нет.

Я хочу прочитать таблицу через определенный интервал (используя setInterval), а затем, если произошли изменения, обновить «представление».

Все это прошло хорошо, за исключениемкогда страница EJS действительно должна переключаться с одной страницы на другую.Я даже не уверен, возможно ли это сделать, как только оно будет отображено.Но я бы предпочел просто отобразить другую страницу по тому же пути ('/'), которая изменяется при обновлении браузера.

Первоначальный условный оператор отображает правильную страницу EJS, но, как я уже сказал, когда-тоНужно переключиться, страница остается на обновлении браузера.

Я попытался переместить размещение условия в нескольких местах (внутри "get", снаружи и т. Д.).

Также попытался выполнить оператор "if" внутри одного EJSстраница, но она не будет обновляться после рендеринга начальной страницы, а затем функция вызывается снова с помощью 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);

Итак, после открытия и запроса нужных мне данных, язапустив get и render в db.close.В этом коде я могу получить «true» и «false» для записи в журнал соответствующим образом при изменении БД, но рендер не изменится, если однажды будет выполнена всеобъемлющая функция.

Извините, если трудно прочитать,но это сводило меня с ума весь день.

1 Ответ

0 голосов
/ 17 мая 2019

Ваша логика (получение данных, переключение вида) должна быть ВНУТРИ вашего app.get ("/" ... Здесь вы запрашиваете данные только один раз (на сервере) при запуске и устанавливаете статический маршрут со статическимdatas.

Попробуйте что-то вроде этого:

// 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>
...