2016-08-19 6 views
0

Я следующий код:MySQL, Node.js Последовательные действия. Как я могу это сделать?

function query1() { 

var defered = Q.defer(); 

console.log("In query1"); 

var connection = mysql.createConnection({ 
    host: '........', 
    user: 'm...c....a.....i', 
    password: '......Z....9...K', 
    database: '.....ol' 
}); 

connection.connect(function(err) { 
    if (!err) { 
     console.log("Database is connected ..."); 
    } else { 
     console.log("Error connecting database ..."); 
    } 
}); 

sql = '' + 
    'select c.ID as CENA_ID, ' + 
    '  c.I_KEY as CENA_NUMERO, ' + 
    '  c.NM_CENA as CENA_NOME, ' + 
    '  b.DS_MAC as MAC_BOX, ' + 
    '  v.DS_CLIENTID as ALEXA_ID, ' + 
    ' v.FK_ID_GRUPO as GRUPO_ID ' + 
    ' from TB_DISPOSITIVOS_VOZ v ' + 
    '  inner join TB_GRUPOS g ' + 
    '  on g.ID = v.FK_ID_GRUPO ' + 
    '  inner join TB_CENAS c ' + 
    '  on g.ID = c.FK_ID_GRUPO ' + 
    '  inner join TB_CENTRAIS b ' + 
    '  on g.ID = b.FK_ID_GRUPO ' + 
    'where v.DS_CLIENTID = "' + userId + '" ' + 
    'and lower(c.NM_CENA) like "%' + sceneName.toLowerCase() + '%"'; 


console.log("Created query"); 

try{ 

    connection.query(sql, function(erro, rows, fields) { 

     if (!erro) { 

      console.log("Executed query verifying the userId"); 

      contador = 0; 

      if (rows.length > 0) { 

       cena_id = rows[0].CENA_ID; 
       cena_numero = rows[0].CENA_NUMERO; 
       cena_nome = rows[0].CENA_NOME; 
       alexa_id = rows[0].ALEXA_ID; 
       grupo_id = rows[0].GRUPO_ID; 
       mac_box = rows[0].MAC_BOX; 

       contador = contador + 1; 

      } 

      console.log("contador: " + contador); 

     } else { 
      console.log("Error - getting the Alexa register in database" + erro); 
      context.fail("Error - getting the Alexa register in database" + erro); 
     } 

    }); 


}catch (ex){ 
    console.log("exception: " + ex); 
} 

}

И этот код, а также:

Q.all([query1()]).then(function(results) { 

     console.log("Q.all log function"); 

     if (contador > 0) { 

      console.log("contador > 0"); 

      var client = mqtt.connect('mqtt://.............com'); 
      console.log("connected to MQTT broker"); 

      var buffer = [26, 
       0,0,0,0,555,645,0,0,0,0,0, 
       0,5555,2,Math.floor((Math.random() * 200) + 1), 
       0,0,0,333,13,4,0,1,0, 
       cena_numero 
      ]; 

      console.log("Created buffer"); 

      client.on('connect', function() { 

       client.publish('n/c/' + mac_box + '/app', buffer); 

       console.log("sent MQTT"); 

      }); 

      speechOutput = "Command " + sceneName + " executed successfully"; 
      repromptText = ""; 
      console.log("Process executed successfully") 

     } else { 

      console.log("contador <= 0"); 

      speechOutput = "This command was not found!"; 
      repromptText = ""; 

     } 

    }, function (reason) { 

     console.log("reason: " + reason); 

    }); 

Как я могу сделать для второго кода выполнять только тогда, когда первый query1() выполнена правильно ? Потому что в функции query1() у меня есть MySQL Query, и я могу продолжить процесс после результата этого запроса.

Кто-нибудь может мне помочь?

Большое спасибо!

ответ

0

Я решил свою проблему с async пакета, как это:

var async = require('async'); 

async.series([ 
      function(callback) { 

       //action 1... 

      }, 
      function(callback){ 

       //action 2... 
      } 
     ], function(err) { 
      if (err) { 
       speechOutput = "Scene not found!"; 
       repromptText = "Please try again."; 
      } 
      console.log("Before speechOutput"); 
      callback(sessionAttributes, 
        buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession)); 
     }); 
1

Вам не хватает ключевых концепций обратных вызовов и асинхронного поведения в Node.js. Вы используете библиотеку «Q» (кстати, я бы рекомендовал вместо нее использовать синюю птицу) для выполнения обещаний, но ваша функция «query1» не возвращает обещание. Вот почему query1 выполняется, но ваша «функция журнала Q.all» будет выполняться до завершения запроса1.

Вы можете структурировать свой код, как это вместо (я приведу пример с Блюберд, так как я знаком с ней):

var Promise = require('bluebird'); 

var _connection; 

function query1() { 
    return new Promise(resolve, reject) { 
    //open your connection 
    connection.open(function (err, connection) { 
     if (err) return reject(err); 

     _connection = connection; 
     //do your query 
     _connection.query(sql, [params], function (err, data) { 
     if (err) return reject(err); 
     else resolve(data); 
     }); 
    }); 
    }); 
} 

function query2(data) { 
    return new Promise(resolve, reject) { 
    //do your query, using data passed in from query1 
    _connection.query(sql, [params], function (err, data) { 
     if (err) return reject(err); 
     else resolve(data); 
    }); 
    }); 
} 


query1 
    .then(function (data) { query2(data); }) 
    .catch(function (err) { 
    console.log('error:', err); 
    }); 

Кроме того, просто FYI, конкатенации SQL строка, как это нет-нет, что откроет вам до инъекции SQL атаки:

like "%' + sceneName.toLowerCase() + '%"

Вместо, используйте like "%?%" и обратитесь к SQL с connection.query(sql, [sceneName], function(err, data) {}). Надеюсь это поможет.

+0

этот Блюберд пакет является с 'неожиданной лексемы {' –

+0

Я не запускать код, указанный выше, так что вам нужно отредактировать его, чтобы сделать его запустить. Это было в информационных целях, надеясь указать вам в правильном направлении. –

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