2016-12-26 5 views
1

У меня есть несколько запросов к MySQL, где я визуализирую первый и сделаю вызываемыми остальные в один файл (/ данные) EJS как объекты.Node.js - Передача нескольких объектов в один и тот же файл EJS

оказывает только первых результатов запроса (OBJ), а затем я делаю все остальное вызываемого к EJS (rsum_total_sales & rsum_count_active)

Это кажется, что первый раз, когда я загружаю файл EJS я получаю фронтэнда 500 ошибок, как

rsum_total_sales is not defined 

, но когда я перезагрузить браузер я получаю EJS к лоа ding fine, показывая все необходимые результаты, полученные из файла маршрута.

Странно, что даже в первый раз, в console.log() Я вижу, что все три результата запроса были помещены в объекты, которые я сделал, однако они не могут быть еще пригодны для EJS, кроме первых, которые непосредственно отображаются к нему.

От ошибки EJS я вижу, что он проходит первые результаты connection.query (OBJ), которая предоставляется, но не остальное два (rsum_total_sales & sum_count_active), которые я просто сделать их объекты отозваны, пока я не перезагрузить браузер.

файл маршрута

var obj = {}; 
var qsum_total_sales = 'SELECT SUM (total_price) AS s_total_price FROM myrecords'; 
var qsum_count_active = 'SELECT COUNT (*) AS s_count_active FROM myrecords WHERE NOT status = "canceled" '; 
var qdata = 'SELECT * FROM myrecords'; 

router.get('/data', function(req, res){ 
    connection.query(qdata, function(err, result) { 
     if(err){ 
      throw err; 
      } else { 
       obj = {print: result}; 
       res.render('data', obj); 
       console.log(obj); 
     } 
    }); 

    connection.query(qsum_total_sales, function(err, rows, result) { 
     if(err){ 
      throw err; 
     } else { 
      rsum_total_sales = JSON.parse(rows[0].s_total_price).toFixed(2); 
      console.log(rsum_total_sales); 
      //First time prints result but it can't be called to EJS until reloading EJS 
     } 
    }); 

    connection.query(qsum_count_active, function(err, rows, result) { 
     if(err){ 
      throw err; 
     } else { 
      rsum_count_active = JSON.parse(rows[0].s_count_active); 
      console.log(rsum_count_active); 
      //First time prints result but it can't be called to EJS until reloading EJS 
     } 
    }); 
}); 

EJS файл

<tbody> 
    <% print.forEach(function (datatable) { %> 
     <tr> 
      <td><%= datatable.id %></td 
      <td><%= datatable.full_name %></td> 
      //rest of loop 
     </tr>        
     <% }) %> 
</tbody> 
    // some html code 
<h4>Total sales sum is: <%- rsum_total_sales %></h4> 
<h4>Total active records are: <%- rsum_count_active %></h4> 

Frontend Ошибка (только тогда, когда это первый раз, когда Эйс загружает в браузер)

ReferenceError: C:\NodeJS\CRUD-1\views\data.ejs:39 
    37|   </table> 
    38|   <hr/> 
>> 39|   <h4>Total sales sum is: <%- rsum_total_sales %></h4> 
    40|   <h4>Total active records are: <%- rsum_count_active %></h4> 

rsum_total_sales is not defined 
at eval (eval at <anonymous> (C:\NodeJS\CRUD-1\node_modules\ejs\lib\ejs.js:481:12), 
<anonymous>:47:17) 
at returnedFn (C:\NodeJS\CRUD-1\node_modules\ejs\lib\ejs.js:512:17) 
at View.exports.renderFile [as engine] (C:\NodeJS\CRUD- 1\node_modules\ejs\lib\ejs.js:364:31) 
at View.render (C:\NodeJS\CRUD-1\node_modules\express\lib\view.js:126:8) 
at tryRender (C:\NodeJS\CRUD-1\node_modules\express\lib\application.js:639:10) 
at EventEmitter.render (C:\NodeJS\CRUD-1\node_modules\express\lib\application.js:591:3) 
at ServerResponse.render (C:\NodeJS\CRUD-1\node_modules\express\lib\response.js:960:7) 
at Query._callback (C:\NodeJS\CRUD-1\routes\data.js:36:17) 
at Query.Sequence.end (C:\NodeJS\CRUD-1\node_modules\mysql\lib\protocol\sequences\Sequence.js:86:24) 
at Query._handleFinalResultPacket (C:\NodeJS\CRUD-1\node_modules\mysql\lib\protocol\sequences\Query.js:144:8) 
+1

я не вижу, где вы посылаете '' rsum_total_sales' и rsum_count_active' в веб-интерфейсе. –

ответ

1

Я не вижу, где вы отправляете rsum_total_sales и rsum_count_active на передний план. Также вы используете 3 queries отдельно, second один не дожидается first, который должен быть завершен, и аналогичным образом third не дожидаясь завершения второго.

Как только первый один заканчивает он будет посылать данные (obj) обратно в client(front-end) и привычка ждать second и thirdquery до конца, следовательно, вы не можете знать, если вы получили все data в front-end.

Вы должны сделать второе в обратном вызове первого и третьего в обратном вызове второго и отправить obj в front-end после успешного завершения третьего запроса. Таким образом, вы можете гарантировать, что все данные будут работать с интерфейсом.

Попробуйте это:

var obj = {}; 
var qsum_total_sales = 'SELECT SUM (total_price) AS s_total_price FROM myrecords'; 
var qsum_count_active = 'SELECT COUNT (*) AS s_count_active FROM myrecords WHERE NOT status = "canceled" '; 
var qdata = 'SELECT * FROM myrecords'; 

router.get('/data', function(req, res) { 
    connection.query(qdata, function(err, result) { 
    if (err) { 
     throw err; 
    } else { 
     obj = { 
     print: result 
     }; 

     console.log(obj); 
     connection.query(qsum_total_sales, function(err, rows, result1) { 
     if (err) { 
      throw err; 
     } else { 
      rsum_total_sales = JSON.parse(rows[0].s_total_price).toFixed(2); 
      console.log(rsum_total_sales); 


      connection.query(qsum_count_active, function(err, rows2, result2) { 
      if (err) { 
       throw err; 
      } else { 
       rsum_count_active = JSON.parse(rows2[0].s_count_active); 
       console.log(rsum_count_active); 

       //After successful completion of all 3 queries send data back to cliend(front-end) 
       //its better to create new obj everytime and send it 
       //store all the data in obj and send back to client 
       var obj = {}; 
       obj.print = result; 
       obj.rsum_count_active = rsum_count_active; 
       obj.rsum_total_sales = rsum_total_sales; 
       res.render('data', obj); 
      } 
      }); 
     } 
     }); 
    } 
    }); 

}); 
+0

Это было очень ясно и логично объяснено и действительно работает. Если это концепция иллюстрации, это ясно раскрыло мой разум.Однако он показывает первые симптомы так называемого «обратного ада» или «горы гибели». Представьте себе, что в какой-то момент может потребоваться 5 или 10 различных запросов, которые их результаты будут переданы в тот же файл EJS. – Vasikos

+1

В этом случае вы можете использовать 'promises' вместо' callbacks', и вам не придется решать проблему «callback hell». –

+0

Я принимаю ваш ответ, потому что по-своему (используя 'callbacks' ** вместо ** обещаний), помог найти решение моей проблемы, по крайней мере сейчас, когда у меня есть только несколько запросов. Я обязательно попытаюсь преобразовать это в метод 'promises' в следующие несколько дней. – Vasikos