2013-03-20 30 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++) {