2016-07-18 103 views
-1

我重視我的服務器代碼:順序不正確執行(node.js的)

var net = require('net'); 
var sqlite3 = require('sqlite3').verbose(); 
var db = new sqlite3.Database('MyBBDD.db'); 
var prueba = ''; 

function get_kw_actual(nombre,callback){ 
    stmt = db.prepare("SELECT kw_actual FROM usuarios WHERE usuario = ?"); 
     stmt.bind(nombre); 
     stmt.get(function(error,row){ 
      if(error){ 
       throw err; 
      } 
      else{ 
       if(row){ 
        entero=row.kw_actual; 
        callback(entero); 
       } 
       else{ 
        console.log("error"); 
       } 
      } 
     }); 
} 

var server = net.createServer(function(socket) { 
    console.log("Recibo peticion"); 

    socket.on('data', function (data) { 
     get_kw_actual('Pepe',function(resultado){ 
      console.log('resultado es: ' + resultado); 
      prueba = '' + resultado; 
     }) 
     socket.write(prueba); 
    }); 

    socket.on('close', function() { 
      console.log('Connection closed'); 
    }); 

}); 
server.listen(1337, '192.168.1.101'); 

在我的服務器,我收到一個請求,我打電話給我的功能「get_kw_actual」我得到了一些我的數據庫,最後我回應了結果。 問題是它首先運行「socket.write(prueba);」比:

stmt.get(function(error,row){ 
      if(error){ 
       throw err; 
      } 
      else{ 
       if(row){ 
        entero=row.kw_actual; 
        callback(entero); 
       } 
       else{ 
        console.log("error"); 
       } 
      } 
     }); 

所以......執行沒有按正確的順序執行,結果是不正確的。 有人知道我該如何解決它? 在此先感謝。

此致敬禮。

回答

0

Node.js代碼異步運行。回調get_kw_actual中的代碼立即返回,但回調將在稍後數據庫操作完成時運行。你想要做的是把socket.write回調的內部,像這樣:

socket.on('data', function (data) { 
    get_kw_actual('Pepe',function(resultado){ 
     console.log('resultado es: ' + resultado); 
     socket.write(resultado); 
    }) 
}); 

另外請注意,您使用的是全局變量prueba在你的代碼,當你運行多個客戶針對其將獲得你的慘敗服務器。不要在節點中使用像這樣的全局變量。

+0

非常非常感謝你!這是正確的!! :) – Tecnico