node.js + MySQL&JSON结果 – callback问题&没有响应客户端

我想使用node.js查询mySQL数据库,并返回结果作为JSON在移动应用程序中使用。 不幸的是,我的请求只是sorting超时,服务器没有任何好的2分钟,直到日志文件显示我的console.log() statements。

而且,callback不会返回任何结果。 这只是空的。

 // 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-concept的基本理解,我的代码应该查询db(它确实),并在通过callback函数完成时返回一个json(显然不是)响应客户端(不能真正检查,因为JSON的空)。

我想我犯了一个(或几个)重大错误。 帮助和/或有用的链接将不胜感激。 谢谢!

解决scheme,由于hexacyanide

 // 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); }); }; 

您正在执行一个较老的指导,指导您在发送响应之前等待请求的close事件,但实际上您不再需要这样做。

发生什么事是你没有发送你的回应,所以你的客户正在超时。 只有等到客户超时才会发生close事件。 由于客户在您发送回复时已经断开连接,因此您不会在客户端上收到任何内容,只能在terminal中看到它。

要解决这个问题,只要停止等待closures事件并在调用请求处理程序时立即运行代码:

 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);