0

私は 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. forループのres.writeがhtmlページに何も出力しないのはなぜですか? 2. for の 2 の代わりに何を書きますか?

4

1 に答える 1

3
  1. 問題は実行のタイミングです。

    connection.query()は非同期であるため、クエリが終了するまでコールバックの実行を遅らせますfunctionが、その間、周囲のコード ブロックを続行できます。これにより、 のres.end('End')前に実行されres.write('name:',rows[i].code)ます。

    も delayres.end()するには、コールバック内に移動します。

    connection.query(..., function(err, rows, fields) {
        if (err) throw err;
    
        for (...) {
            res.write('name:',rows[i].code);
        }
        res.end('End');
    });
    
  2. rowsArrayがない場合はである必要があるerrため、そのlengthプロパティを使用できます。

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

    lengthの値をローカル変数に格納することも一般的な方法です。

    for (var i = 0, len = rows.length; i < len; i++) {
    
于 2013-03-20T21:34:39.220 に答える