2016-12-26 76 views
1

我有多個MySQL查詢結果,其中我將第一個渲染並將剩餘的對象作爲對象作爲單個EJS文件(/ data)進行調用。Node.js - 將多個對象傳遞給相同的EJS文件

我僅渲染第一查詢結果(OBJ),然後我做出了EJS其餘贖回(rsum_total_sales & rsum_count_active

看來,我第一次加載EJS文件我得到前端500錯誤,如

rsum_total_sales is not defined 

但是當我重新加載瀏覽器時,我得到EJS的loa很好,顯示從路線文件中獲得的所有需要​​的結果。

奇怪的是,即使是第一次,在console.log()我看到,所有三個查詢結果已放入我所做的對象中,但它們還不能被調用到EJS,除了第一個直接呈現的到它。

從EJS的錯誤,我可以看到,它通過其呈現的第一connection.query結果(OBJ),而不是其餘2個(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> 

前端錯誤(只有當它是第一時間EJS加載到瀏覽器)

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_salesrsum_count_active到前端。另外,你正在運行3 queries分開,second一個不會等待first一個完成,同樣third一個不會等待第二個完成。

只要第一個完成它會發送數據(obj)回client(front-end)並不會等待secondthirdquery完成,因此你不能知道,如果你在front-end得到了所有的data

您應該在第二個回調中的第一個和第三個回調中執行第二個操作,並在成功完成第三個查詢後將obj發送到前端。這樣你可以確保所有的數據都要前端。

試試這個:

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

我接受你的答案,因爲它以自己的方式(使用''callback''而不是'promises')來幫助解決我的問題,至少現在我只有幾個疑問。我肯定會在未來幾天嘗試將其轉換爲'promises'方法。 – Vasikos

相關問題