2013-03-20 31 views
0

我寫了這個代碼在node.js中:上連接不能RESPONSE.WRITE的node.js

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.write('start\n'); 
    var mysql  = require('mysql'); 
    var connection = mysql.createConnection({ 
     host  : 'hostname', 
     user  : 'user', 
     password : 'pass', 
     database : 'dbname', 
    }); 

    connection.connect(); 

    connection.query('SELECT code FROM user_type', function(err, rows, fields) { 
     if (err) throw err; 
      //This for is to run on all the results 
      for(var i=0;i<2;i++){ 
      res.write('name:',rows[i].code); 
     } 
    }); 

    connection.end(); 

    res.end('End'); 
}).listen(8080); 
console.log('Server running'); 

我的問題是:1。 爲什麼res.write在我的HTML for循環打印什麼頁? 2.寫什麼而不是2中的?

回答

3
  1. 問題是執行時間。

    由於connection.query()是異步的,它會將回調function的執行延遲到查詢結束時,但允許周圍的代碼塊在此期間繼續。這導致res.end('End')res.write('name:',rows[i].code)之前執行。

    要還耽誤res.end(),移動它回調裏面:

    connection.query(..., function(err, rows, fields) { 
        if (err) throw err; 
    
        for (...) { 
         res.write('name:',rows[i].code); 
        } 
        res.end('End'); 
    }); 
    
  2. rows應該是一個Array當沒有一個err,所以你可以使用它的length property

    for (var i = 0; i < rows.length; i++) { 
    

    length的值存儲在局部變量中也是一種常見做法:

    for (var i = 0, len = rows.length; i < len; i++) {