2016-10-25 2 views
1

привет, я пытаюсь написать файл PDF, используя данные из базы данных MySQL, но когда я запускаю скрипт, он дает мне, чтобы я закончил создание файла PDF, и после этого я попытался вставить данные к нему ..... я думаю, это потому, что MySQL в узле является асинхронным. есть ли решение для этого? вот мой код ...синхронных запросов mysql в узле при создании pdf

var project_ID = 1; 
var PDFDocument = require('pdfkit'); 
$('#pdf').click(function(e) { 
    e.preventDefault(); 
    var pdf = new PDFDocument; 
    pdf.pipe(fs.createWriteStream(__dirname + '/../MyFile.pdf')); 
    var option; 
    switch ($("input[name=report-type]:checked").val()) { 
     case 'all-issues': 
      option = {project_id: project_ID}; 
      break; 

     case 'all-issues-customer': 
      option = {project_id: project_ID, customer: customer}; 
      break; 
    } 
    connection.getConnection(function (err, conn) { //make connection to DB 
     if (err) { //error handling 
      showNotification('error connecting: ' + err.stack, 'danger', 'glyphicon glyphicon-tasks'); 
      return; 
     } 
     conn.query('SELECT issues.id, issues.dbid , issues.date, issues.charm , issues.defect ,issues.key , issues.status, issues.summary, issues.description , actions.date as action_date, actions.description as action_desc FROM issues' + 
      ' INNER JOIN actions on issues.id = actions.issue_id WHERE ? ', [option], function (error, data) { 
      if (error) { 
       showNotification('Error :' + error, 'danger', 'glyphicon glyphicon-tasks'); 
      } else { 
       var lastID = -1; 
       data.forEach(function (data) { 
        if (lastID !== data.id) { 
         lastID = data.id; 
         pdf.addPage(); 
         pdf.text('Number :' + data.dbid).moveDown(); 
         pdf.text('Customers :   '); 
         pdf.text('Baseline :   '); 
         pdf.text('Error/Wish :   ' + data.key).moveDown(); 
         pdf.text('Charm : ' + data.charm + '/Defect : ' + data.defect + '     Status : ' + data.status); 
         pdf.text('Summary :    ' + data.summary); 
         pdf.text('Description :   ' + data.description).moveDown(); 
         pdf.text('Actions/ History :').moveDown(); 
        } 
        pdf.text('   - date  : ' + convertDate(data.date)); 
        pdf.text('   description : ' + data.description).moveDown(); 
       }) 
      } 
     }); 
     conn.release(); 
    }); 
    pdf.end(); 
}); 

ответ

0

Это из-за асинхронной природы Node.js. Вы можете быстро изменить свой код в нескольких областях, чтобы исправить это. У вас есть некоторые звонки, такие как conn.release() и pdf.end(), которые падают за пределами вашего обратного вызова.

В приведенном ниже коде я переместил conn.release() и pdf.end() в последние строки вашего обратного вызова соединения mysql.

var project_ID = 1; 
var PDFDocument = require('pdfkit'); 
$('#pdf').click(function(e) { 
    e.preventDefault(); 
    var pdf = new PDFDocument; 
    pdf.pipe(fs.createWriteStream(__dirname + '/../MyFile.pdf')); 
    var option; 
    switch ($("input[name=report-type]:checked").val()) { 
     case 'all-issues': 
      option = {project_id: project_ID}; 
      break; 

     case 'all-issues-customer': 
      option = {project_id: project_ID, customer: customer}; 
      break; 
    } 
    connection.getConnection(function (err, conn) { //make connection to DB 
     if (err) { //error handling 
      showNotification('error connecting: ' + err.stack, 'danger', 'glyphicon glyphicon-tasks'); 
      return; 
     } 
     conn.query('SELECT issues.id, issues.dbid , issues.date, issues.charm , issues.defect ,issues.key , issues.status, issues.summary, issues.description , actions.date as action_date, actions.description as action_desc FROM issues' + 
      ' INNER JOIN actions on issues.id = actions.issue_id WHERE ? ', [option], function (error, data) { 
      if (error) { 
       showNotification('Error :' + error, 'danger', 'glyphicon glyphicon-tasks'); 
      } else { 
       var lastID = -1; 
       data.forEach(function (data) { 
        if (lastID !== data.id) { 
         lastID = data.id; 
         pdf.addPage(); 
         pdf.text('Number :' + data.dbid).moveDown(); 
         pdf.text('Customers :   '); 
         pdf.text('Baseline :   '); 
         pdf.text('Error/Wish :   ' + data.key).moveDown(); 
         pdf.text('Charm : ' + data.charm + '/Defect : ' + data.defect + '     Status : ' + data.status); 
         pdf.text('Summary :    ' + data.summary); 
         pdf.text('Description :   ' + data.description).moveDown(); 
         pdf.text('Actions/ History :').moveDown(); 
        } 
        pdf.text('   - date  : ' + convertDate(data.date)); 
        pdf.text('   description : ' + data.description).moveDown(); 
       }) 
      } 
      conn.release(); 
      pdf.end(); 
     }); 
    }); 
}); 

Это должно гарантировать, что эти вызовы не будут выполнены до тех пор, пока не будет выполнена логика обратного вызова. Примечание, что если у вас был обратный вызов (или более) в этом обратном вызове, вам часто приходится проверять, чтобы эти функции вызывались внутри этих обратных вызовов. Вы часто окажетесь в середине Callback Hell.

Удачи вам!

+1

спасибо человеку ..... я переместил pdf.end() внутри, и он сработал. –

+0

Добро пожаловать :) – Ding

Смежные вопросы