2016-12-26 4 views
1

먼저 여러 개의 MySQL 쿼리 결과가 있는데 나머지는 단일 EJS 파일 (/ data)로 객체로 호출 할 수 있습니다.Node.js - 동일한 EJS 파일에 여러 객체 전달하기

나는 단지 쿼리 결과 (OBJ)를 렌더링 한 후 나는 EJS에 호출 나머지 (rsum_total_sales & rsum_count_active)

처음 내가로드하는 것 같다을 프론트 엔드와 같은 500 오류가 발생하는 EJS 파일

rsum_total_sales is not defined 

그러나 브라우저를 다시로드하면 경로 파일에서 얻은 필요한 결과를 모두 표시합니다.

처음에는 console.log()에서 3 개의 쿼리 결과가 모두 내가 만든 객체에 저장되어 있다는 것을 알 수 있습니다. 그러나 직접 렌더링하는 첫 번째 객체를 제외하고는 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> 

프런트 엔드 오류 파일 (이 1 시간 인 경우에만 해당 브라우저에 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을 별도로 실행하면 secondfirst이 완료 될 때까지 기다리지 않으며 마찬가지로 third은 두 번째 완료를 기다리지 않습니다. 당신이 front-end의 모든 data을 가지고있는 경우

는 곧 첫 번째는 다시 client(front-end)과 실 거예요 데이터 (obj)를 전송이 완료 될 때까지 secondthirdquery을 기다리는 완료로, 따라서 당신은 알고 기운 다.

두 번째 콜백에서 첫 번째와 세 번째 콜백에서 두 번째 작업을 수행하고 세 번째 쿼리가 성공적으로 완료되면 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

이 경우'callbacks' 대신에'promises'를 사용할 수 있습니다. 그러면'callback hell'의 문제를 다룰 필요가 없습니다. –

+0

나는 자신의 방식으로 ('promises'의 'callbacks' ** 대신에 ** 사용하기 때문에) 당신의 대답을 받아들입니다. 적어도 몇 가지 질문이있는 곳에서, 제 문제에 대한 해결책을 얻는데 도움이되었습니다. 나는 앞으로 며칠 안에 이것을'promises' 방법으로 바꾸려고 노력할 것입니다. – Vasikos

관련 문제