2016-08-19 3 views
0

Ich habe den folgenden Code:MySQL, Node.js Sequentielle Aktionen - Wie kann ich das tun?

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); 
} 

}

Und diesen Code auch:

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); 

    }); 

Wie kann ich für den zweiten Code tun nur ausgeführt, wenn der erste query1() korrekt ausgeführt ? Weil ich in der Funktion query1() habe ich eine MySQL-Abfrage, und ich kann nur mit dem Prozess nach dem Ergebnis dieser Abfrage fortfahren.

Jeder kann mir helfen?

Vielen Dank!

Antwort

0

ich mein Problem mit async Paket wie folgt gelöst:

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

Ihnen fehlen einige Schlüsselkonzepte in Bezug auf Rückrufe und asynchrones Verhalten in Node.js. Sie verwenden die "Q" -Bibliothek (übrigens würde ich empfehlen, stattdessen bluebird zu testen), um Versprechungen zu behandeln, aber Ihre "query1" -Funktion gibt kein Versprechen zurück. Deshalb wird query1 ausgeführt, aber Ihre "Q.all log function" wird ausgeführt, bevor query1 beendet ist.

Sie Ihren Code wie folgt statt strukturieren können (Ich werde ein Beispiel mit drossel geben, da ich mit ihm vertraut bin):

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); 
    }); 

Auch nur FYI, wie diese verketten SQL-Zeichenfolge ist ein no-no, die Sie bis zu einem SQL-Injection-Angriff öffnet:

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

verwenden Sie stattdessen like "%?%" und Ihre SQL mit connection.query(sql, [sceneName], function(err, data) {}) nennen. Hoffe das hilft.

+0

dieses drossel Paket ist mit 'unerwartetes Token {' –

+0

ich den Code nicht oben laufen, so dass Sie es zu bearbeiten brauchen, um es zu machen, Lauf. Es diente nur zu Informationszwecken, um Sie in die richtige Richtung zu lenken. –