2013-12-12 55 views
12

我想使用node.js查詢mySQL數據庫並返回結果作爲JSON在移動應用程序中使用。不幸的是,我的請求只是排序超時,服務器在2分鐘內沒有做任何事情,直到日誌文件顯示我的console.log()-聲明。node.js + MySQL&JSON結果 - 回調問題&沒有響應客戶端

此外,回調不返回任何結果。它只是空的。

// Check dependencies 
var http = require('http'); 
// Create the http server. 
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ 
http.createServer(function(request, response) { 
    // Attach listener on end event. 
    request.on('close', function() { 
     console.log('request'); 

     // run asynchronous 
     getSQL(function(err, result) { 
      console.log('json:', result); 
      response.writeHead(200, { 
       'Content-Type' : 'x-application/json' 
      }); 
      // Send data as JSON string. 
      response.end(result); 
     }); 
    }); 
}).listen(3000); 

// Access MySQL via node-mysql 
// https://github.com/felixge/node-mysql 
function getSQL(callback) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host : 'localhost', 
     user : 'user', 
     password : 'pw', 
     database : 'db', 
     socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default? 
    }); 

    connection.connect(); 
    var json = ''; 
    var query = 'SELECT * FROM test'; 
    connection.query(query, function(err, results, fields) { 
     if (err) 
      return callback(err, null); 

     console.log('The result is: ', results[0]); 

     // wrap result-set as json 
     json = JSON.stringify(results); 
    }); 
    connection.end(); 

    callback(null, json); 
}; 

輸出後,如2分:

$ node app.js 
request 
json: 
The result is: { test: 'avc' } 
json2: [{"test":"avc"}] 

基於我整個的Node.js概念的非常基本的理解,我的代碼應該查詢數據庫(它),一次返回一個JSON它是通過回調函數完成的(顯然不是),它是作爲對客戶端的響應發回的(不能真正檢查,因爲json是空的)。

我想我犯了一個(或幾個)重大錯誤。幫助和/或有用的鏈接將不勝感激。謝謝!

解決方案,這要歸功於六氰化物

// Check dependencies 
var http = require('http'); 
// Create the http server. 
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ 

/*************** 
* Correction 1: Using the request.on('close', function()(...)-listener isn't required anymore 
***************/ 
http.createServer(function(req, res) { 
    console.log('Receving request...'); 
    var callback = function(err, result) { 
     res.writeHead(200, { 
      'Content-Type' : 'x-application/json' 
     }); 
     console.log('json:', result); 
     res.end(result); 
    }; 

    getSQL(callback); 

}).listen(3000); 

// Access MySQL via node-mysql 
// https://github.com/felixge/node-mysql 
function getSQL(callback) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host : 'localhost', 
     user : 'user', 
     password : 'pw', 
     database : 'db', 
     socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default? 
    }); 

    connection.connect(); 
    var json = ''; 
    var query = 'SELECT * FROM test'; 
    connection.query(query, function(err, results, fields) { 
     if (err) 
      return callback(err, null); 

     console.log('The query-result is: ', results[0]); 

     // wrap result-set as json 
     json = JSON.stringify(results); 

     /*************** 
     * Correction 2: Nest the callback correctly! 
     ***************/ 
     connection.end(); 
     console.log('JSON-result:', json); 
     callback(null, json); 
    }); 
}; 
+3

+1 THX,一直在尋找的正是這種例子 – Thariama

+0

@Thariama同意,這是正是我一直在努力的。 –

回答

9

你遵循老指南,指導您發送響應之前,等待請求的close事件,但實際上你不再需要做到這一點。

發生了什麼是你沒有發送你的回覆,所以你的客戶端是超時。直到客戶超時爲止,纔會觸發close事件。由於您發送回覆時客戶端已斷開連接,因此客戶端上沒有任何內容,只能在終端中看到它。

要解決這個問題,只是停止等待close事件和運行代碼時立即請求處理程序被稱爲:

var http = require('http'); 
http.createServer(function(req, res) { 
    getSQL(function(err, result) { 
    res.writeHead(200, { 
     'Content-Type' : 'x-application/json' 
    }); 
    res.end(result); 
    }); 
}).listen(3000); 
+3

非常感謝喲,非常棒!可能會花費我幾十年的時間來弄清楚。 –