2015-11-06 34 views
0

這是我app.js文件印刷的NodeJS問題

var http = require('http'); 
var url = require('url'); 
var mysql = require('mysql'); 
var requestListener = function(request, response){ 
var urlParse = url.parse(request.url,true); 
var path = urlParse.pathname; 
var query = urlParse.query; 
var jsonString; 
if(path === "/getArticleById"){ 
    var conn = mysql.createConnection({ 
     host:'localhost', 
     port:'3306', 
     user:'root', 
     password:'root123', 
     database:'food' 
    }); 
    conn.connect(function(err){ 
     if(err){ 
      console.log('Error connecting to database'); 
      return; 
     } 
     response.writeHead(200, {'Content-Type': 'text/plain' }); 
    }); 
    var id = query.id; 
    conn.query('select * from article where id=?', id,function(err,rows){ 
     if(err){ 
      console.log(err); 
     } 

     jsonString = rows; 
    }); 
    conn.end(); 
    console.log(jsonString); 
} 
}; 

var server = http.createServer(requestListener); 
server.listen(8080); 

在jsonString這裏面conn.query,我正在印刷行的價值。 最後一個console.log沒有打印任何東西,它也是jsonString。

對不起,我是node.js中的新手,不知道如何使用對象。

+0

我正在獲取行中的數據,但數據沒有存儲在jsonString中。 –

回答

1

Javascript本質上是異步的。

conn.query('select * from article where id=?', id,function(err,rows){ 
     if(err){ 
      console.log(err); 
     } 

     jsonString = rows; 
    }); 

嘗試回調中打印jsonString。所以,你的代碼應該看起來像

conn.query('select * from article where id=?', id,function(err,rows){ 
     if(err){ 
      console.log(err); 
     } 

     jsonString = rows; 
     console.log(jsonString); 
    }); 

如何使你的代碼獲取執行

  1. 分配到VAR ID是越來越來完成。
  2. 對db的查詢命中。這是一個非常耗時的過程(異步任務),當這個查詢得到解決時,你的回調函數被調用。請注意,這需要一些時間,這意味着在某個時候這個回調將被調用,您將在哪裏獲得行。
  3. 在調用query()之後(但在獲得結果/回調之前),您的下一行代碼即conn.end()將被執行。然後你試圖打印jsonString,注意,直到現在你還沒有從DB返回結果(因爲它是異步操作)。這就是爲什麼jsonString沒有任何價值。因此你沒有得到結果打印。

解決方案:

打印的jsonString檢索結果之後。這意味着,在回調中。

+0

嗨Gaurav,我能夠在conn.query()內打印jsonString,但不能在它之外打印。 –

+0

查看有關了解工作流程的詳細答案。我建議你閱讀一些關於'javascript'的異步性質的文章,並嘗試玩這個概念。 – guptakvgaurav

+0

@PuneetKala如果這可以解決您的問題,請點擊綠色勾號 – guptakvgaurav