2013-03-20 3 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 страница? 2. что писать вместо 2 в for?

ответ

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++) { 
    
Смежные вопросы