node.js + MySQL & JSON-result - 回调问题 & 对客户端无响应

Posted

技术标签:

【中文标题】node.js + MySQL & JSON-result - 回调问题 & 对客户端无响应【英文标题】:node.js + MySQL & JSON-result - Callback-issue & no response to client 【发布时间】:2013-12-30 05:36:30 【问题描述】:

我想使用 node.js 来查询 mysql 数据库并将结果作为 JSON 返回以用于移动应用程序。不幸的是,我的请求只是有点超时,服务器在 2 分钟内什么也没做,直到日志文件显示我的 console.log()-statements。

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

// 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 概念的非常基本的理解,我的代码应该查询 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 thx,正在寻找这个例子 @Thariama 同意,这正是我一直在做的事情。 【参考方案1】:

您遵循的是旧指南,该指南指示您在发送响应之前等待请求的 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);

【讨论】:

非常感谢,效果很好!我可能要花几十年的时间才能弄清楚。

以上是关于node.js + MySQL & JSON-result - 回调问题 & 对客户端无响应的主要内容,如果未能解决你的问题,请参考以下文章

node.js mysql 池 beginTransaction & 连接

如何使用 node.js&Mysql 从在线表单向数据库添加数据?

Node.js & MySQL - 错误:1251 - 客户端不支持服务器请求的身份验证协议;考虑升级 MySQL 客户端

Node.js + MySQL 实现数据的增删改查

mysql数据需要写入json文件

Node.js和mybatis分别实现mysql中like变量模糊查询