node.js + MySQL& JSON结果 - 回调问题&没有回应客户

时间:2013-12-12 00:34:30

标签: javascript mysql json node.js

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

此外,回调不会返回任何结果。它只是空的。

// 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(它确实)并在通过回调函数(显然没有)完成后返回一个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);
    });
};

1 个答案:

答案 0 :(得分:10)

您正在关注较旧的指南,指示您在发送回复之前等待请求的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);